[racket-dev] submodule in macro

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Sat Jan 26 10:36:52 EST 2013

[[ I don't really understand the answer. I mean 
   I understand the technicality but not the spirit. ]]

The 'f' comes from the macro input in both cases. 
Hence the rename-out could be seen as the actual
name required. 





On Jan 26, 2013, at 6:55 AM, Matthew Flatt wrote:

> At Sat, 26 Jan 2013 01:12:04 -0500, Stephen Chang wrote:
>> Is this a supported use of submodules?
>> 
>> 
>> #lang racket
>> 
>> (define-syntax (def-wrapped stx)
>>  (syntax-case stx ()
>>    [(_ (f arg ...) body ...)
>>     #'(begin
>>         (module tmp-module-name racket
>>           (define (f-tmp arg ...) (displayln "wrapper") body ...)
>>           (provide (rename-out [f-tmp f])))
>>         (require (quote tmp-module-name)))]))
>> 
>> (def-wrapped (f x) (+ x 1))
>> (f 100)
>> 
>> 
>> Welcome to DrRacket, version 5.3.1.3 [3m].
>> Language: racket [custom].
>> . f: unbound identifier in module in: f
> 
> Your `require' is macro-introduced, so it only binds uses that are also
> macro-introduced. Try renaming on import, since the rename target is an
> identifier supplied to the macro:
> 
> #lang racket
> 
> (define-syntax (def-wrapped stx)
>  (syntax-case stx ()
>    [(_ (f arg ...) body ...)
>     #'(begin
>         (module tmp-module-name racket
>           (define (f-tmp arg ...) (displayln "wrapper") body ...)
>           (provide f-tmp))
>         (require (rename-in (quote tmp-module-name) 
>                             [f-tmp f])))]))
> 
> (def-wrapped (f x) (+ x 1))
> (f 100)
> 
> _________________________
>  Racket Developers list:
>  http://lists.racket-lang.org/dev


Posted on the dev mailing list.