The main problem with Racket's macro system (and with other syntax-case systems) is that instead of raw s-expressions you're dealing with syntax objects. This becomes very ugly when identifiers are handled: instead of dealing with plain symbols, you're dealing with these syntax values (called “identifiers” in this case) that are essentially a symbol and some opaque information that represents the lexical scope for its source. In several syntax-case systems this is the only difference from defmacro macros, but in the Racket case this applies to everything — identifiers, numbers, other immediate constants, and even function applications, etc — they are all wrapped with additional information.
Name:
Anonymous2011-04-22 3:22
The main problem with Common Lisp's macro system (and with other define-macro systems) is that instead of syntax objects you're dealing with raw s-expressions. This becomes very ugly when using the macro in a different context than it was defined in: instead of dealing with identifiers, you're dealing with these plain data (called “symbols” in this case) that are essentially an identifier stripped of anything but their name, including the lexical scope for its source. In several define-macro systems this is the only difference from hygienic macros, but in the Common Lisp case this combines with its terrible module system (called “packages”) and lack of phasing (eval-when considered harmful to your mental health) to create a system which is only held together by duct tape and prayer.