I think I found a solution which allows me to inject the (#%require lng) without causing conflicts with other required module: applying an extra scope to the whole body makes the other (require) forms more specific, and they can shadow bindings imported by (#%require lng).
Here is the modified "MyLang.rkt": #lang racket (provide (rename-out [my-module-begin #%module-begin])) (define-syntax (my-module-begin stx) (syntax-case stx () [(_ real-lang body) (syntax-case (local-expand #'(module m real-lang body) 'top-level (list)) () [(module nm lng (#%plain-module-begin . body2)) #`(#%plain-module-begin (#%require lng) . #,((make-syntax-introducer) #'body2))])])) And here's an example file using it: (module m "MyLang.rkt" ;; delegates to this language: typed/racket/base ;; body: (begin (require racket/set) (displayln ;; arrow successfully drawn to typed/racket/base (set ;; arrow successfully drawn to racket/set "Hello")))) Without the extra scope, I would get this error because racket/set shadows these bindings imported by typed/racket/base: module: identifier already imported from a different source in: for/set racket/set typed/racket/base My problem seems solved, but if this extra-scope trick has some unwanted consequences, I would definitely want to hear about them! -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.