On 1/23/20 3:59 PM, Sean Kemplay wrote:
Hello,

I am exploring macros and am trying to define a variable at the top level (with the goal in mind to dynamically define a group of functions from a macro).

with-syntax works fine however I was just wondering if it is possible to directly inject an identifier as syntax within syntax - something like the following which does not work!

(define-syntax x
     (lambda (x)
       #`(define ,#'y "y val")))

(x)
y => y: undefined;
  cannot reference an identifier before its definition

First, to escape a quasisyntax (#`) template you need to use unsyntax (#,), not unquote (,).

Second, due to hygiene the y from the macro has an extra scope, so you can't refer to it by typing y at the top level. But you can do this, for example:

  (define-syntax (x2 stx)
    #`(begin (define #,#'y "y val") y))

Or you can write a macro that defines a y with the lexical context of the macro use:

  (define-syntax (x3 stx)
    #`(define #,(datum->syntax stx 'y) "y val"))

You could also write this macro with with-syntax instead. The way that you insert an identifier into a syntax template (quasisyntax/unsyntax vs with-syntax) is independent of the way you create the identifier.

(Note: using the lexical context of the macro use works here, but it's not always the right answer. Unhygienic macros are complicated.)

Ryan

--
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/4b02bc1c-cd8a-feed-2c1c-0025209ffab3%40ccs.neu.edu.

Reply via email to