[racket-dev] submodule in macro

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Sat Jan 26 06:55:00 EST 2013

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)


Posted on the dev mailing list.