1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-31 09:20:23 +02:00

(resolve-module): Abstraction maintenance: Use

`module-public-interface'.
(resolve-module): Extend to handle selection and renaming in spec.
Arg is now `spec' which can be a simple module name (list of symbols)
or a interface spec.
(symbol-prefix-proc): New proc.
(process-define-module): Use "define-module" in error messages
instead of "defmodule".  Factor error into internal proc.
Rewrite `use-module' and `use-syntax' handlers.
Replace some single-arm `if-not' constructs w/ `or'.
(process-use-modules): Arg is now `module-interface-specs',
which is passed through to `resolve-interface' as before; nfc.
(named-module-use!, top-repl): Abstraction maintenance: Use `provided?'.
This commit is contained in:
Thien-Thi Nguyen 2001-05-10 22:00:22 +00:00
parent 163a7e0d02
commit fb1b76f432

View file

@ -1560,7 +1560,7 @@
(if already (if already
;; The module already exists... ;; The module already exists...
(if (and (or (null? maybe-autoload) (car maybe-autoload)) (if (and (or (null? maybe-autoload) (car maybe-autoload))
(not (module-ref already '%module-public-interface #f))) (not (module-public-interface already)))
;; ...but we are told to load and it doesn't contain source, so ;; ...but we are told to load and it doesn't contain source, so
(begin (begin
(try-load-module name) (try-load-module name)
@ -1584,7 +1584,8 @@
(set-module-public-interface! module interface)))) (set-module-public-interface! module interface))))
(if (and (not (memq the-scm-module (module-uses module))) (if (and (not (memq the-scm-module (module-uses module)))
(not (eq? module the-root-module))) (not (eq? module the-root-module)))
(set-module-uses! module (append (module-uses module) (list the-scm-module))))) (set-module-uses! module (append (module-uses module)
(list the-scm-module)))))
(define (purify-module! module) (define (purify-module! module)
"Removes bindings in MODULE which are inherited from the (guile) module." "Removes bindings in MODULE which are inherited from the (guile) module."
@ -1609,17 +1610,70 @@
(module-define! module (car name) m) (module-define! module (car name) m)
(make-modules-in m (cdr name))))))) (make-modules-in m (cdr name)))))))
(define (resolve-interface name) ;; Return a module interface made from SPEC.
(let ((module (resolve-module name))) ;; SPEC can be a list of symbols, in which case it names a module
(and module (module-public-interface module)))) ;; whose public interface is found and returned.
;;
;; SPEC can also be of the form:
;; (MODULE-NAME [:select SELECTION] [:rename RENAMER])
;; in which case a partial interface is newly created and returned.
;; MODULE-NAME is a list of symbols, as above; SELECTION is a list of
;; selection-specs to be imported; and RENAMER is a procedure that takes a
;; symbol and returns its new name. A selection-spec is either a symbol or a
;; pair of symbols (ORIG . SEEN), where ORIG is the name in the used module
;; and SEEN is the name in the using module. Note that SEEN is also passed
;; through RENAMER.
;;
;; The `:select' and `:rename' clauses are optional. If both are omitted, the
;; returned interface has no bindings. If the `:select' clause is omitted,
;; RENAMER operates on the used module's public interface.
;;
;; Signal error if module name is not resolvable.
;;
(define (resolve-interface spec)
(let* ((simple? (not (pair? (car spec))))
(name (if simple? spec (car spec)))
(module (resolve-module name)))
(if (not module)
(error "no code for module" name)
(let ((public-i (module-public-interface module)))
(cond ((not public-i)
(beautify-user-module! module)
(set! public-i (module-public-interface module))))
(if simple?
public-i
(let ((selection (cond ((memq ':select spec) => cadr)
(else (module-map (lambda (sym var) sym)
public-i))))
(rename (cond ((memq ':rename spec)
=> (lambda (x)
(eval (cadr x) (current-module))))
(else identity)))
(partial-i (make-module 31)))
(set-module-kind! partial-i 'interface)
(for-each (lambda (sel-spec)
(let* ((direct? (symbol? sel-spec))
(orig (if direct?
sel-spec
(car sel-spec)))
(seen (if direct?
sel-spec
(cdr sel-spec))))
(module-add! partial-i (rename seen)
(module-variable module orig))))
selection)
partial-i))))))
(define (symbol-prefix-proc prefix)
(define %autoloader-developer-mode #t) (lambda (symbol)
(symbol-append prefix symbol)))
(define (process-define-module args) (define (process-define-module args)
(let* ((module-id (car args)) (let* ((module-id (car args))
(module (resolve-module module-id #f)) (module (resolve-module module-id #f))
(kws (cdr args))) (kws (cdr args))
(unrecognized (lambda ()
(error "unrecognized define-module argument" kws))))
(beautify-user-module! module) (beautify-user-module! module)
(let loop ((kws kws) (let loop ((kws kws)
(reversed-interfaces '()) (reversed-interfaces '())
@ -1638,32 +1692,24 @@
(string->symbol (substring s 1)))))))) (string->symbol (substring s 1))))))))
(case keyword (case keyword
((use-module use-syntax) ((use-module use-syntax)
(if (not (pair? (cdr kws))) (or (pair? (cdr kws))
(error "unrecognized defmodule argument" kws)) (unrecognized))
(let* ((used-name (cadr kws)) (let* ((spec (cadr kws))
(used-module (resolve-module used-name))) (interface (resolve-interface spec)))
(if (not (module-ref used-module (and (eq? keyword 'use-syntax)
'%module-public-interface (or (symbol? (car spec))
#f)) (error "invalid module name for use-syntax"
(begin spec))
((if %autoloader-developer-mode warn error) (set-module-transformer!
"no code for module" (module-name used-module)) module
(beautify-user-module! used-module))) (module-ref interface (car (last-pair module-name))
(let ((interface (module-public-interface used-module))) #f)))
(if (not interface) (loop (cddr kws)
(error "missing interface for use-module" (cons interface reversed-interfaces)
used-module)) exports)))
(if (eq? keyword 'use-syntax)
(set-module-transformer!
module
(module-ref interface (car (last-pair used-name))
#f)))
(loop (cddr kws)
(cons interface reversed-interfaces)
exports))))
((autoload) ((autoload)
(if (not (and (pair? (cdr kws)) (pair? (cddr kws)))) (or (and (pair? (cdr kws)) (pair? (cddr kws)))
(error "unrecognized defmodule argument" kws)) (unrecognized))
(loop (cdddr kws) (loop (cdddr kws)
(cons (make-autoload-interface module (cons (make-autoload-interface module
(cadr kws) (cadr kws)
@ -1677,13 +1723,13 @@
(purify-module! module) (purify-module! module)
(loop (cdr kws) reversed-interfaces exports)) (loop (cdr kws) reversed-interfaces exports))
((export) ((export)
(if (not (pair? (cdr kws))) (or (pair? (cdr kws))
(error "unrecognized defmodule argument" kws)) (unrecognized))
(loop (cddr kws) (loop (cddr kws)
reversed-interfaces reversed-interfaces
(append (cadr kws) exports))) (append (cadr kws) exports)))
(else (else
(error "unrecognized defmodule argument" kws)))))) (unrecognized))))))
(set-current-module module) (set-current-module module)
module)) module))
@ -1784,7 +1830,7 @@
(issue-deprecation-warning (issue-deprecation-warning
"Autoloading of compiled code modules is deprecated." "Autoloading of compiled code modules is deprecated."
"Write a Scheme file instead that uses `dynamic-link' directly."))) "Write a Scheme file instead that uses `dynamic-link' directly.")))
(define (init-dynamic-module modname) (define (init-dynamic-module modname)
;; Register any linked modules which have been registered on the C level ;; Register any linked modules which have been registered on the C level
(register-modules #f) (register-modules #f)
@ -2557,13 +2603,13 @@
;; the guts of the use-modules macro. add the interfaces of the named ;; the guts of the use-modules macro. add the interfaces of the named
;; modules to the use-list of the current module, in order ;; modules to the use-list of the current module, in order
(define (process-use-modules module-names) (define (process-use-modules module-interface-specs)
(for-each (lambda (module-name) (for-each (lambda (mif-spec)
(let ((mod-iface (resolve-interface module-name))) (let ((mod-iface (resolve-interface mif-spec)))
(or mod-iface (or mod-iface
(error "no such module" module-name)) (error "no such module" mif-spec))
(module-use! (current-module) mod-iface))) (module-use! (current-module) mod-iface)))
(reverse module-names))) module-interface-specs))
(defmacro use-modules modules (defmacro use-modules modules
`(eval-case `(eval-case
@ -2649,8 +2695,8 @@
(module-use! (resolve-module user) (resolve-module usee))) (module-use! (resolve-module user) (resolve-module usee)))
(define (load-emacs-interface) (define (load-emacs-interface)
(if (memq 'debug-extensions *features*) (and (provided? 'debug-extensions)
(debug-enable 'backtrace)) (debug-enable 'backtrace))
(named-module-use! '(guile-user) '(ice-9 emacs))) (named-module-use! '(guile-user) '(ice-9 emacs)))
@ -2675,10 +2721,10 @@
:use-module (ice-9 session) :use-module (ice-9 session)
:use-module (ice-9 debug) :use-module (ice-9 debug)
:autoload (ice-9 debugger) (debug))) ;load debugger on demand :autoload (ice-9 debugger) (debug))) ;load debugger on demand
(if (memq 'threads *features*) (and (provided? 'threads)
(named-module-use! '(guile-user) '(ice-9 threads))) (named-module-use! '(guile-user) '(ice-9 threads)))
(if (memq 'regex *features*) (and (provided? 'regex)
(named-module-use! '(guile-user) '(ice-9 regex))) (named-module-use! '(guile-user) '(ice-9 regex)))
(let ((old-handlers #f) (let ((old-handlers #f)
(signals (if (provided? 'posix) (signals (if (provided? 'posix)