mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-07-05 04:06:36 +02:00
Adding introspection to available unloaded modules.
This commit is contained in:
parent
daf5478824
commit
fc2ca6181f
1 changed files with 51 additions and 1 deletions
|
@ -1,5 +1,5 @@
|
||||||
;; modules.scm -- module introspection utilities
|
;; modules.scm -- module introspection utilities
|
||||||
;; Copyright (c) 2011 Alex Shinn. All rights reserved.
|
;; Copyright (c) 2011-2013 Alex Shinn. All rights reserved.
|
||||||
;; BSD-style license: http://synthcode.com/license.txt
|
;; BSD-style license: http://synthcode.com/license.txt
|
||||||
|
|
||||||
;;> Module introspection library.
|
;;> Module introspection library.
|
||||||
|
@ -143,3 +143,53 @@
|
||||||
(eq? (procedure-name x) (ref-name (set-var (car ls)))))
|
(eq? (procedure-name x) (ref-name (set-var (car ls)))))
|
||||||
(set-value (car ls))
|
(set-value (car ls))
|
||||||
(lp (cdr ls))))))))
|
(lp (cdr ls))))))))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; finding all available modules
|
||||||
|
|
||||||
|
(define (module-file? file)
|
||||||
|
(let ((len (string-length file)))
|
||||||
|
(and (> len 4) (equal? ".sld" (substring file (- len 4))))))
|
||||||
|
|
||||||
|
(define (read-static-modules file)
|
||||||
|
(protect (exn (else '()))
|
||||||
|
(call-with-input-file file
|
||||||
|
(lambda (in)
|
||||||
|
(let lp ((res '()))
|
||||||
|
(let ((expr (read in)))
|
||||||
|
(cond
|
||||||
|
((eof-object? expr)
|
||||||
|
res)
|
||||||
|
((and (pair? expr) (eq? 'define-library (car expr)))
|
||||||
|
(let ((name (cadr expr))
|
||||||
|
(exports (cond ((assq 'export (cddr expr)) => cdr)
|
||||||
|
(else '()))))
|
||||||
|
(lp (cons (cons name (make-module exports #f #f)) res))))
|
||||||
|
(else
|
||||||
|
(lp res)))))))))
|
||||||
|
|
||||||
|
(define (available-modules-in-directory dir)
|
||||||
|
(directory-fold-tree
|
||||||
|
dir #f #f
|
||||||
|
(lambda (file res)
|
||||||
|
(if (module-file? file)
|
||||||
|
(append (read-static-modules file) res)
|
||||||
|
res))
|
||||||
|
'()))
|
||||||
|
|
||||||
|
(define (available-modules)
|
||||||
|
(reverse
|
||||||
|
(apply append
|
||||||
|
*modules*
|
||||||
|
(map available-modules-in-directory
|
||||||
|
(current-module-path)))))
|
||||||
|
|
||||||
|
(define (modules-exporting-identifier name)
|
||||||
|
(let lp ((ls (available-modules))
|
||||||
|
(res '()))
|
||||||
|
(cond
|
||||||
|
((null? ls) (reverse res))
|
||||||
|
((and (memq name (module-exports (cdar ls)))
|
||||||
|
(not (assoc (caar ls) res)))
|
||||||
|
(lp (cdr ls) (cons (car ls) res)))
|
||||||
|
(else (lp (cdr ls) res)))))
|
||||||
|
|
Loading…
Add table
Reference in a new issue