On Wed, Nov 24, 2010 at 11:49 AM, John Clements <cleme...@brinckerhoff.org> wrote:
> > Hang on... you're still using the term "hygienic" in the non-Felleisen way. > That is, if we accept that a hygienic system is one that has well-defined > behavior but where you can bind new names when you explicitly ask to, then That's too loose a definition. The Common Lisp macro system has well-defined behavior, and you can bind new names when you explicitly ask, yet it is not hygienic. I expect that Kohlbecker has a reasonable definition (but I'm too lazy to look it up right now), but I'd say that `hygiene' at the very least involves a default behavior of preserving the lexical scope at the point of macro use. I'd say that having the ability to inject new bindings or shadow existing ones is perhaps an `advanced feature' that may be desirable, but not necessary. (Frankly, I'm very opposed to injecting any sort of binding or name that does not appear as a literal identifier near the point of use, but I don't really care if other people want to write bad code.) It is the default behavior that is of interest. It allows me to understand code fragments such as: (let ((x 22)) (frob x) x) and to *know* that alpha-renaming `x' does not involve looking at the expansion of `frob'. -- ~jrm _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users