xported} ;;; (define (module-ref module name . rest) "Returns the value of a variable called NAME in MODULE or any of its used modules. If there is no such variable, then if the optional third argument DEFAULT is present, it is returned; otherwise an error is signaled." (let ((variable (module-variable module name))) (if (and variable (variable-bound? variable)) (variable-ref variable) (if (null? rest) (error "No variable named" name 'in module) (car rest) ; default value )))) ;; MODULE-SET! -- exported ;; (define (module-set! module name value) "Sets the variable called NAME in MODULE (or in a module that MODULE uses) to VALUE; if there is no such variable, an error is signaled." (let ((variable (module-variable module name))) (if variable (variable-set! variable value) (error "No variable named" name 'in module)))) ;; MODULE-DEFINE! -- exported ;; (define (module-define! module name value) "Sets the variable called NAME in MODULE to VALUE; if there is no such variable, it is added first." (let ((variable (module-local-variable module name))) (if variable (begin (variable-set! variable value) (module-modified module)) (let ((variable (make-variable value))) (module-add! module name variable))))) ;; MODULE-DEFINED? -- exported ;; (define (module-defined? module name) "Return #t iff NAME is defined in MODULE (or in a module that MODULE uses)." (let ((variable (module-variable module name))) (and variable (variable-bound? variable)))) (define (module-use! module interface) "Add INTERFACE to the list of interfaces used by MODULE." (if (not (or (eq? module interface) (memq interface (module-uses module)))) (begin ;; Newly used modules must be appended rather than consed, so that ;; `module-variable' traverses the use list starting from the first ;; used module. (set-module-uses! module (append (module-uses module) (list interface))) (hash-clear! (module-import-obarray module)) (module-modified module)))) (define (module-use-interfaces! module interfaces) "Same as MODULE-USE!, but only notifies module observers after all interfaces are added to the inports list." (let* ((cur (module-uses module)) (new (let lp ((in interfaces) (out '())) (if (null? in) (reverse out) (lp (cdr in) (let ((iface (car in))) (if (or (memq iface cur) (memq iface out)) out (cons iface out)))))))) (set-module-uses! module (append cur new)) (hash-clear! (module-import-obarray module)) (module-modified module)))