I think that `#%top` shouldn't be there, and I'll look into removing it.
At Thu, 24 Jul 2014 16:32:58 -0400, Asumu Takikawa wrote: > Hi all, > > I have a question about syntax lifting and catching those lifts. Here's > an example program that illustrates my concern: > > #lang racket > > ;; do the lifting > (define-syntax (m stx) > (syntax-local-lift-expression #'(+ 1 1))) > > ;; catch the lift, try to put definitions in a let > (define-syntax (catch stx) > (syntax-case stx () > [(_ body ...) > (syntax-case (local-expand/capture-lifts #'(body ...) > (syntax-local-context) null) > (define-values begin) > [(begin (define-values (x ...) e ...) ... exp) > #'(let () (define-values (x ...) e ...) ... exp)])])) > > (catch (+ 1 (m))) > > I'd like this program to work and produce `3` in the end, but it produces an > unbound identifier error. > > The trouble is that when a syntax lift is done, the identifier produced > by the lift is a top-level identifier and gets wrapped with #%top. That > means that putting the caught definitions in a `let` can't work, because > those become local let-bindings. > > In the example above, the relevant excerpt of the expansion is this: > > (letrec-values (((lifted.0) (#%app + '1 '1))) ; does not bind below > (#%app (#%app + '1 (#%top . lifted.0)))) > > Does the design of syntax lifting preclude this kind of macro > interaction? > > Cheers, > Asumu > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users

