Yes, you want to be in an 'expression context. To get into one:

 (define-syntax (local-expanding-transformer stx)
   (cond
    [(eq? 'expression (syntax-local-context))
     (syntax-parse stx
       [(_ e:expr)
        (define-values [stx opaque]
          (syntax-local-expand-expression #'e))
        opaque])]
    [else #`(#%expression #,stx)]))

Wrapping the result with `#%expression` is too late; you need to be in
an expression context already to successfully use
`syntax-local-expand-expression`.

At Fri, 27 Jan 2017 12:43:49 -0800, Alexis King wrote:
> Given that Turnstile makes extremely heavy use of local-expand,
> it’s easy to imagine that the macro expander could traverse a single
> piece of syntax dozens of times when it really only needs to traverse
> it once. Looking at the docs, it seems like syntax-local-expand-expression
> is precisely designed for this sort of thing, but I have no idea
> how to properly use it. I tried writing the simplest possible macro
> I could think of, which expands a single expression and produces
> it:
> 
>   (define-syntax-parser local-expanding-transformer
>     [(_ e:expr)
>      (define-values [stx opaque]
>        (syntax-local-expand-expression #'e))
>      opaque])
> 
> However, this doesn’t seem to work:
> 
>   > (local-expanding-transformer (+ 1 2))
>   #%app: expanded syntax not in its original lexical context
>          (extra bindings or scopes in the current context)
>     in: (#%app + (quote 1) (quote 2))
> 
> This seems to happen because the resulting expression is expanded
> in an internal definition context rather than an expression context,
> because this works, instead:
> 
>   > (#%expression (local-expanding-transformer (+ 1 2)))
>   3
> 
> However, trying to move that use of #%expression into the expansion
> of local-expanding-transformer itself does not alleviate the problem:
> 
>   (define-syntax-parser local-expanding-transformer
>     [(_ e:expr)
>      (define-values [stx opaque]
>        (syntax-local-expand-expression #'e))
>      #`(#%expression #,opaque)])
> 
>   > (local-expanding-transformer (+ 1 2))
>   #%app: expanded syntax not in its original lexical context
>          (extra bindings or scopes in the current context)
>     in: (#%app + (quote 1) (quote 2))
> 
> Considering this, does this mean that the only situation in which
> it’s safe to use syntax-local-expand-expression is when
> (syntax-local-context) is 'expression? Is there any way for me to
> force the result of the macro to be expanded in an expression
> context? Why doesn’t wrapping the result with #%expression work?
> 
> -- 
> 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 racket-users+unsubscr...@googlegroups.com.
> 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 racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to