You can use a wrapper around a helper macro to achieve that: #lang agile
;; The helper does the actual work (define-syntax-parser local-expanding-transformer-helper [(_ e:expr) (define-values [stx opaque] (syntax-local-expand-expression #'e)) opaque]) ;; The main macro puts the helper in an expression context (define-syntax-parser local-expanding-transformer [(_ e:expr) #'(#%expression (local-expanding-transformer-helper e))]) (local-expanding-transformer (+ 1 2)) Alex Knauth > On Jan 27, 2017, at 12:43 PM, Alexis King <lexi.lam...@gmail.com> 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.