I think the right change might be (module evaluator racket .... (define (prep!) (parameterize ([current-namespace namespace]) (dynamic-require (variable-reference->module-path-index (#%variable-reference)) 0))) .... (define-syntax phase1-phase0-eval (syntax-parser [(_ form:expr ...) #'(begin (prep!) (eval-syntax .....))])))
The `prep!` function ensures that the enclosing module is available. At Wed, 7 May 2014 10:11:49 -0400, Sam Tobin-Hochstadt wrote: > This program: https://gist.github.com/samth/e7b55fcef66da9b8416a works > when line 33 is uncommented, otherwise it gives the error: > > ?: module mismatch; > attempted to use a module that is not available > possible cause: > using (dynamic-require .... #f) > but need (dynamic-require .... 0) > module: (submod "weird.rkt" evaluator) > phase: 0 > in: phase1-phase0-run > context...: > weird.rkt: [running body] > > From reading the docs on `dynamic-require`, I can see that > `(dynamic-require m 'f)` doesn't make anything available for higher > phases. However, the actual `dynamic-require` in the program is just > for a function -- the need for higher phases is an implementation > detail that's leaking in because it doesn't behave like a regular > value wrt `dynamic-require`. > > Is there something I can change in the implementation of the internals > of `f` so that clients of `f` don't need to do the extra > `(dynamic-require m 0)` in order for `f` to work? > > Sam > _________________________ > Racket Developers list: > http://lists.racket-lang.org/dev _________________________ Racket Developers list: http://lists.racket-lang.org/dev