Racket: fix for module compilation for recent rackets
[geiser.git] / scheme / guile / geiser / modules.scm
blob780d39e419c2fcc687d6e0261dde0e30e118796a
1 ;;; modules.scm -- module metadata
3 ;; Copyright (C) 2009, 2010, 2011 Jose Antonio Ortega Ruiz
5 ;; This program is free software; you can redistribute it and/or
6 ;; modify it under the terms of the Modified BSD License. You should
7 ;; have received a copy of the license along with this program. If
8 ;; not, see <http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5>.
10 ;; Start date: Mon Mar 02, 2009 02:00
12 (define-module (geiser modules)
13   #:export (symbol-module
14             module-name?
15             module-path
16             find-module
17             all-modules
18             submodules
19             module-location)
20   #:use-module (geiser utils)
21   #:use-module (system vm program)
22   #:use-module (ice-9 regex)
23   #:use-module (ice-9 session)
24   #:use-module (srfi srfi-1))
26 (define (module-name? module-name)
27   (and (list? module-name)
28        (not (null? module-name))
29        (every symbol? module-name)))
31 (define (symbol-module sym . all)
32   (and sym
33        (catch 'module-name
34          (lambda ()
35            (apropos-fold (lambda (module name var init)
36                            (if (eq? name sym)
37                                (throw 'module-name (module-name module))
38                                init))
39                          #f
40                          (regexp-quote (symbol->string sym))
41                          (if (or (null? all) (not (car all)))
42                              (apropos-fold-accessible (current-module))
43                              apropos-fold-all)))
44          (lambda (key . args)
45            (and (eq? key 'module-name) (car args))))))
47 (define (module-location name)
48   (make-location (module-path name) #f))
50 (define (find-module mod-name)
51   (and (module-name? mod-name)
52        (resolve-module mod-name #f #:ensure #f)))
54 (define (module-path module-name)
55   (and (module-name? module-name)
56        (or ((@@ (ice-9 session) module-filename) module-name)
57            (module-filename (resolve-module module-name #f)))))
59 (define (submodules mod)
60   (hash-map->list (lambda (k v) v) (module-submodules mod)))
62 (define (root-modules)
63   (submodules (resolve-module '() #f)))
65 (define (all-modules)
66   (define (maybe-name m)
67     (and (module-kind m) (format #f "~A" (module-name m))))
68   (let* ((guile (resolve-module '(guile)))
69          (roots (remove (lambda (m) (eq? m guile)) (root-modules)))
70          (children (append-map all-child-modules roots)))
71     (cons "(guile)" (filter-map maybe-name children))))
73 (define* (all-child-modules mod #:optional (seen '()))
74   (let ((cs (filter (lambda (m) (not (member m seen))) (submodules mod))))
75     (fold (lambda (m all) (append (all-child-modules m all) all))
76           (list mod)
77           cs)))