On Apr 1, 2009, at 16:28, Kevin Van Horn wrote:

> But
>
>    (def (wmd x {:a 1}) 37)
>
> gives me an error: "Second argument to def must be a Symbol".  This
> confuses me.  Doesn't macro expansion happen entirely before
> evaluation? So before the def special form is evaluated, (wmd x {:a
> 1}) should have already been macro expanded to give a symbol.

Special forms are treated pretty much like macros, except that there  
is nothing more fundamental they expand to, instead they are handled  
directly by the compiler. But for the purpose of analyzing why your  
example doesn't work, let's pretend that def is a macro.

The compiler sees "def" as the first element of a list, and notes  
that def is a macro (as we are pretending it is). It thus calls the  
def macro with the rest of the list elements as arguments. The first  
argument to def is (wmd x {:a 1}), the second argument is 37. As you  
can see, the first argument is indeed not a symbol, it is a list of  
three elements, wmd, x, and {:a 1}. And that's why def rightly  
complains - though I can't tell you why it says "second" instead of  
"first" argument.

An important point to note about macros (and special forms) is that  
they are expanded from the outside inwards, contrary to expression  
evaluation, which starts at the innermost arguments and proceeds  
outward. It has to be like that because otherwise a macro couldn't  
fully define the syntax of its arguments. A macro might well expect  
one of its arguments to be a list with a specific format. If that  
argument were macroexpanded first, the outer macro would lose control.

In your example, the wmd macro is thus not expanded at all, UNLESS  
the def macro copies it somewhere into its output form, which is then  
subjected to another round of macro expansion.

Konrad.




--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to