In a top-level begin, you can put a begin-for-syntax, so the following definition works for your example: (define-syntax (def-and-use-of-x stx) (syntax-parse stx [(def-and-use-of-x val) (with-syntax ([gen-id (generate-temporary)]) #'(begin (begin-for-syntax (set! I #'gen-id)) (define gen-id val) (displayln gen-id)))]))
----- Original Message ----- From: "Asumu Takikawa" <as...@ccs.neu.edu> To: "Matthias Felleisen" <matth...@ccs.neu.edu> Cc: "Racket Users" <users@racket-lang.org> Sent: Monday, July 21, 2014 9:50:24 AM GMT -05:00 US/Canada Eastern Subject: Re: [racket] Managing communication between two macro invocations at the top-level On 2014-07-21 09:18:05 -0400, Matthias Felleisen wrote: > I have used this on one occasion. Does it work for you? I don't think it will work because in my situation at the top-level, the definition `(define a 10)` comes in a separate `begin` block (IOW, in another interaction) which breaks the connection. Here's an example showing the error you'd get: -> (define-for-syntax id #f) -> (define-syntax (def-and-use-of-x stx) (syntax-parse stx [(def-and-use-of-x val) (with-syntax ([gen-id (generate-temporary)]) (set! id #'gen-id) #'(begin (define gen-id val) gen-id))])) -> (define-syntax (produce-id stx) id) -> (def-and-use-of-x 3) 3 -> (produce-id) ; g1: unbound identifier; ; also, no #%top syntax transformer is bound ; in: g1 ; [,bt for context] Cheers, Asumu ____________________ Racket Users list: http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users