#lang racket/base (require (for-syntax racket/base racket/syntax) sugar/test) (provide (all-defined-out)) (define-syntax (define-caching-ns stx) (syntax-case stx () [(_ name) #'(define-caching-ns name null)] [(_ name mods) (with-syntax ([caching-module-name (generate-temporary)]) #'(begin (module caching-module-name racket/base (define-namespace-anchor nsa) ; could handle this macro-introduced name better (provide nsa)) (require 'caching-module-name) (define name (namespace-anchor->namespace nsa)) (require-in-namespace name mods)))])) ;; `namespace-require mod` = (eval '(require mod) namespace) (define (require-in-namespace ns module-names) (parameterize ([current-namespace ns]) (for-each (λ(mod-name) (namespace-require mod-name)) module-names))) (define (attach-from-namespace from-ns to-ns module-names) (for-each (λ(mod-name) (namespace-attach-module from-ns mod-name to-ns)) module-names) (require-in-namespace to-ns module-names)) (module-test-external (define module-names '(xml racket/function)) (define-caching-ns from-ns module-names) (check-true (eval '(andmap procedure? (list xexpr? curry)) from-ns)) (define to-ns (make-base-namespace)) (attach-from-namespace from-ns to-ns module-names) (check-true (eval '(andmap procedure? (list xexpr? curry)) to-ns)))