[racket] beginner question about macros
Identifiers aren't symbols. You still have to use datum->syntax to make your manipulated symbols into identifiers. To introduce an identifier in the macro definition context, you would have to use the macro's name from the pattern:
(define-syntax (macro stx)
(syntax-case stx ()
[(macro args ...)
(with-syntax ([x (datum->syntax #'macro 'should-be-in-macro-definition-context)])
...code...)]))
Pinning down what hygiene is at a high level is a research question. Hygiene is currently defined to be what the syntax-case macro expander does ("Syntactic Abstraction in Scheme" ~Dybig '92).
The informal notion is that alpha-equivalence of macro inputs is preserved through expansion. The problem is that binding structure in a macro's input is only determined by macro expansion.
-Ian
----- Original Message -----
From: "Răzvan Rotaru" <razvan.rotaru at gmail.com>
To: "J. Ian Johnson" <ianj at ccs.neu.edu>
Cc: users at racket-lang.org
Sent: Monday, December 5, 2011 10:37:42 AM GMT -05:00 US/Canada Eastern
Subject: Re: [racket] beginner question about macros
Ok, I understand. If I make the identifiers available in the macro
definition scope, by importing the libraries, that would that make the
macro hygienic, right? I would still need to textually transform the
identifier, from X to setX. Can this be achieved by a simple
conversion from string to symbol?
Razvan
On 5 December 2011 17:24, J. Ian Johnson <ianj at ccs.neu.edu> wrote:
> Precisely. Hygiene guarantees that identifiers that are neither explicitly passed to a macro nor in the lexical scope of the macro definition will not be in the output of said macro. This is often too restrictive for macro writers, since we have naming conventions that we want to programmatically produce (consider struct). Thus we have datum->syntax.
>
> You have to be careful about abusing this capability, since unintuitive collisions can happen when you have two macros using one another that depend on unhygienic naming conventions.
> You should try to restrict your use of unhygienic macros to function definitions and not macro definitions.
>
> -Ian