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" <[email protected]>
To: "J. Ian Johnson" <[email protected]>
Cc: [email protected]
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 <[email protected]> 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
_________________________________________________
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users