diff --git a/lib/chibi/modules.module b/lib/chibi/modules.module index 275a69b2..1807694a 100644 --- a/lib/chibi/modules.module +++ b/lib/chibi/modules.module @@ -1,7 +1,8 @@ (module (chibi modules) - (export analyze-module module-ast module-ast-set! - module-ref module-contains? containing-module + (export module-name module-dir module-includes + module-ast module-ast-set! module-ref module-contains? + analyze-module containing-module procedure-analysis) (import-immutable (scheme) (config)) (import (chibi ast)) diff --git a/lib/chibi/modules.scm b/lib/chibi/modules.scm index b9e40e0d..8272e166 100644 --- a/lib/chibi/modules.scm +++ b/lib/chibi/modules.scm @@ -1,3 +1,6 @@ +;; modules.scm -- module introspection utilities +;; Copyright (c) 2011 Alex Shinn. All rights reserved. +;; BSD-style license: http://synthcode.com/license.txt (define (file->sexp-list file) (call-with-input-file file @@ -8,14 +11,42 @@ (reverse res) (lp (cons x res)))))))) -(define (module? x) (vector? x)) +(define (module? x) + (and (vector? x) (>= (vector-length x) 4) (list? (vector-ref x 0)))) (define (module-ast mod) (vector-ref mod 3)) (define (module-ast-set! mod x) (vector-set! mod 3 x)) +(define (module-name mod) + (let lp ((ls *modules*)) + (and (pair? ls) + (if (eq? mod (cdar ls)) + (caar ls) + (lp (cdr ls)))))) + +(define (module-dir mod) + (let ((name (module-name mod))) + (if (member name '((scheme) (config))) + "" + (module-name-prefix name)))) + +(define (module-includes mod) + (let* ((mod (if (module? mod) mod (find-module mod))) + (dir (module-dir mod))) + (define (module-file f) + (find-module-file (string-append dir f))) + (let lp ((ls (module-meta-data mod)) (res '())) + (cond + ((not (pair? ls)) + (reverse res)) + ((and (pair? (car ls)) (eq? 'include (caar ls))) + (lp (cdr ls) (append (map module-file (reverse (cdar ls))) res))) + (else + (lp (cdr ls) res)))))) + (define (analyze-module-source name mod recursive?) (let ((env (module-env mod)) - (dir (if (equal? name '(scheme)) "" (module-name-prefix name)))) + (dir (module-dir mod))) (define (include-source file) (cond ((find-module-file (string-append dir file)) => (lambda (x) (cons 'body (file->sexp-list x)))) @@ -71,11 +102,7 @@ (let lp ((ls (module-ast mod))) (and (pair? ls) (or (and (set? (car ls)) - (eq? var-name (ref-name (set-var (car ls)))) - (begin - ;; (write `(found ,var-name in ,name ,(ast->sexp (car ls))) (current-error-port)) - ;; (newline (current-error-port)) - #t)) + (eq? var-name (ref-name (set-var (car ls))))) (lp (cdr ls)))))) (define (containing-module x) @@ -100,4 +127,3 @@ (eq? (procedure-name x) (ref-name (set-var (car ls))))) (set-value (car ls)) (lp (cdr ls)))))))) -