ce? (hashq-set! (module-replacements public-i) external-name #t)) (module-add! public-i external-name var))) names))) (define (module-replace! m names) (module-export! m names #:replace? #t)) (define (module-export-all! mod) "Export all local variables from a module." (define (fresh-interface!) (let ((iface (make-module))) (set-module-name! iface (module-name mod)) (set-module-version! iface (module-version mod)) (set-module-kind! iface 'interface) (set-module-public-interface! mod iface) iface)) (let ((iface (or (module-public-interface mod) (fresh-interface!)))) (set-module-obarray! iface (module-obarray mod)))) (define* (module-re-export! m names #:key replace?) "Re-export an imported variable." (let ((public-i (module-public-interface m))) (for-each (lambda (name) (let* ((internal-name (if (pair? name) (car name) name)) (external-name (if (pair? name) (cdr name) name)) (var (module-variable m internal-name))) (cond ((not var) (error "Undefined variable:" internal-name)) ((eq? var (module-local-variable m internal-name)) (error "re-exporting local variable:" internal-name)) (else (when replace? (hashq-set! (module-replacements public-i) external-name #t)) (module-add! public-i external-name var))))) names))) (define-syntax-rule (export name ...) (eval-when (expand load eval) (call-with-deferred-observers (lambda () (module-export! (current-module) '(name ...)))))) (define-syntax-rule (re-export name ...) (eval-when (expand load eval) (call-with-deferred-observers (lambda () (module-re-export! (current-module) '(name ...)))))) (define-syntax-rule (export! name ...) (eval-when (expand load eval) (call-with-deferred-observers (lambda () (module-replace! (current-module) '(name ...)))))) (define-syntax-rule (export-syntax name ...) (export name ...)) (define-syntax-rule (re-export-syntax name ...) (re-export name ...))