diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm index ac00ece85..bc9f170ca 100644 --- a/module/ice-9/boot-9.scm +++ b/module/ice-9/boot-9.scm @@ -1925,12 +1925,10 @@ If there is no handler at all, Guile prints an error and then exits." ;; with local variables that happen to be named the same as the submodule. ;; (define (module-ref-submodule module name) - (let ((m (module-ref module name))) - (and m (module? m) m))) + (hashq-ref (module-submodules module) name)) (define (module-define-submodule! module name submodule) - (module-define! module name submodule)) - + (hashq-set! (module-submodules module) name submodule)) diff --git a/module/ice-9/deprecated.scm b/module/ice-9/deprecated.scm index 2ea99ba23..c6dab4e93 100644 --- a/module/ice-9/deprecated.scm +++ b/module/ice-9/deprecated.scm @@ -38,7 +38,9 @@ $tanh closure? %nil - @bind)) + @bind) + + #:replace (module-ref-submodule module-define-submodule!)) ;;;; Deprecated definitions. @@ -298,6 +300,22 @@ (lambda () (set! id old-v) ...))))))))) +(define (module-ref-submodule module name) + (or (hashq-ref (module-submodules module) name) + (let ((var (module-local-variable module name))) + (and (variable-bound? var) + (module? (variable-ref var)) + (begin + (warn "module" module "not in submodules table") + (variable-ref var)))))) + +(define (module-define-submodule! module name submodule) + (let ((var (module-local-variable module name))) + (if (and var (variable-bound? var) (not (module? (variable-ref var)))) + (warn "defining module" module ": not overriding local definition" var) + (module-define! module name submodule))) + (hashq-set! (module-submodules module) name submodule)) + ;; Define (%app) and (%app modules), and have (app) alias (%app). This ;; side-effects the-root-module, both to the submodules table and (through ;; module-define-submodule! above) the obarray.