You can also do this with syntax-local-introduce to remove x's use-site
scope*:
#lang racket
(require (for-syntax syntax/parse))
(define-syntax (my-macro stx)
(syntax-parse stx
[(_ x:id)
#:with x- (syntax-local-introduce #'x)
#'(lambda (a b) x-)]))
((my-macro a) 1 2)
;; 1
((my-macro b) 1 2)
;; 2
(define x 3)
((my-macro x) 1 2)
;; 3
-Sam
* well, I think that's what's going on.
On Fri, Feb 22, 2019 at 1:21 PM Matthias Felleisen <[email protected]>
wrote:
>
>
> > On Feb 22, 2019, at 1:08 PM, Stefano Lande <[email protected]> wrote:
> >
> > Dear all,
> >
> > first of all, I might being misusing the terminology. Sorry about it.
> >
> > I would like to write a macro that gets an identifier and return its
> value in the new lexical scope created by the macro.
> > For example:
> >
> > > (define-syntax (my-macro stx)
> > (syntax-parse stx
> > [(_ x:id) #'(lambda (a b) x) ]))
> >
> >
> > > ((my-macro a) 1 2)
> > 1
> >
> > >((my-macro b) 1 2)
> > 2
> >
> >
> >
> > my-macro as above of course would not work. Is possible to receive an
> identifier, strip the lexical context, and evaluate it in the context of
> (lambda (a b) body) ?
>
>
> Here is one way to get your macro:
>
> #lang racket
>
> (require (for-syntax syntax/parse))
> (require (for-syntax racket/syntax))
>
> (define-syntax (my-macro stx)
> (syntax-parse stx
> [(_ x:id)
> #:with a #'a
> #:with y (datum->syntax #'a (syntax-e #'x))
> #`(lambda (a b) y)]))
>
> [(my-macro a) 1 2]
> [(my-macro b) 1 2]
> (define x 3)
> [(my-macro x) 1 2]
>
> --
> 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 [email protected].
> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.