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.