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 ----- Original Message ----- From: "Răzvan Rotaru" <razvan.rot...@gmail.com> To: "J. Ian Johnson" <i...@ccs.neu.edu> Cc: users@racket-lang.org Sent: Monday, December 5, 2011 9:46:07 AM GMT -05:00 US/Canada Eastern Subject: Re: [racket] beginner question about macros On 5 December 2011 16:39, J. Ian Johnson <i...@ccs.neu.edu> wrote: > Your textual manipulation of identifiers is unhygienic. You will need to do > the following > > (with-syntax ([newX (datum->syntax #'x (translate-symbol (syntax-e #'x)))]) > ...use-of-newX...) > Why it is unhygienic? Because newX doesn't exist in the macro environment, but only in the caller environment? Razvan _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users