BTW, is it possible to extend your solution to macro-introduced imports from a 
submodule?

In the original case, the identifier name was known in advance:

(define-syntax my-module-begin
   (lambda (stx)
     (syntax-case stx ()
       [(_ body ...)
        (with-syntax ([x-id (datum->syntax stx 'x)])
          #'(#%module-begin
              (define x-id 2)
              body ...))])))


But suppose instead the identifiers come from a submodule. I see from the docs 
for `all-from-out` that "macro-introduced imports are not re-exported, unless 
the module-path was introduced at the same time", so it feels like it should go 
something like this, though this doesn't work (there's a difference between the 
unquoted and quoted name that I'm not capturing).

(define-syntax my-module-begin
   (lambda (stx)
     (syntax-case stx ()
       [(_ body ...)
        (with-syntax ([sub-id (datum->syntax stx 'sub)])
          #'(#%module-begin
              (module sub-id racket/base
                (define x 2)
                (provide x))
              (require sub-id)
              (provide (all-from-out sub-id))
              body ...))])))



On Aug 15, 2015, at 6:21 PM, Matthew Butterick <[email protected]> wrote:

> Of your suggestions, I couldn't get `syntax-local-introduce` to work, but 
> `datum->syntax` did. That made the macro-introduced identifier accessible at 
> the REPL. Thanks.
> 
> However, I also wanted to set up the #lang so that DrRacket would 
> automatically print the value of `id` when it ran the file. I noticed I could 
> do this by introducing a `(module+ test ...)` in the #lang itself that prints 
> `id` (because by default, DrRacket automatically runs test submodules). Thus 
> obviating the need for a wrapper module.
> 
> 
> 
> 
> 
> On Aug 15, 2015, at 5:08 PM, Matthew Butterick <[email protected]> wrote:
> 
>> Probably the wiser option. I'll see if I can adapt that solution.
>> 
>> 
>> On Aug 15, 2015, at 4:31 PM, Alexander D. Knauth <[email protected]> 
>> wrote:
>> 
>>> What kind of funny stuff?
>>> By the way, this sounds sort of like this
>>> http://www.mail-archive.com/[email protected]/msg28020.html
>>> Solution: 
>>> http://www.mail-archive.com/[email protected]/msg28031.html
>>> 
>>> Although it could be a completely different problem, I don't know.
>>> 
>>> On Aug 15, 2015, at 6:22 PM, Matthew Butterick <[email protected]> wrote:
>>> 
>>>> I have a #lang that does some funny stuff with #%module-begin (maybe too 
>>>> funny), the result being that when I run it in DrRacket, the `provide`d 
>>>> identifiers aren't visible at the top level:
>>>> 
>>>> (module my-lang-module my-lang
>>>> ...
>>>> (define id 42)
>>>> (provide id))
>>>> 
>>>>> id
>>>> id : undefined;
>>>> cannot reference undefined identifier
>>>> 
>>>> 
>>>> I've found a simple cure (maybe too simple) whereby I wrap my-lang-module 
>>>> with the usual racket/base module, which satisfies DrRacket:
>>>> 
>>>> 
>>>> (module repl-wrapper racket/base
>>>> (module my-lang-module my-lang
>>>> ...
>>>> (define id 42)
>>>> (provide id))
>>>> (require 'my-lang-module)
>>>> (provide (all-from-out 'my-lang-module))
>>>> 
>>>>> id
>>>> 42
>>>> 
>>>> 
>>>> Question: is there an approved way to make this #lang-wrapping happen for 
>>>> the REPL, and only for the REPL? AFAICT `#%top-interaction` is not the 
>>>> cure, because it wraps the commands coming off the REPL (as opposed to the 
>>>> code in the definitions window). 
>>>> 
>>>> -- 
>>>> 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 [email protected].
>>>> For more options, visit https://groups.google.com/d/optout.
>>> 
>> 
> 

-- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to