This is quite amusing since the first reply to the original post already
provided the correct answer :)
On Sep 28, 2011 6:05 AM, "Michał Marczyk" <michal.marc...@gmail.com> wrote:
> Hi Ru,
>
> let's input your macro definition at the REPL:
>
> user> (defmacro infix [e] `(let [[x# f# y#] ~e] (f# x# y#)))
> #'user/infix
>
> So far so good. Now let's try use it in a function:
>
> user> (defn foo [] (infix (5 + 4)))
> #'user/foo
>
> Well now -- it compiled! So, there's no exception being thrown when
> the macro is expanded at compile time; otherwise foo would not have
> compiled.
>
> How about calling foo?
>
> user> (foo)
> ; Evaluation aborted.
> user> *e
> #<ClassCastException java.lang.ClassCastException: java.lang.Long
> cannot be cast to clojure.lang.IFn>
>
> There's your exception: at runtime. By this time there is no trace of
> your macro in the running code (you could undefine it -- by saying
> (ns-unmap 'user 'infix) -- and this would have no effect on foo).
>
>
> Once again: (5 + 4) *is not evaluated when the macro is expanded*. It
> is only evaluated at runtime -- and only then does it explode, as
> expected. The key point is that a macro is just a function called upon
> by the compiler to transform your program prior to it being compiled
> into JVM bytecode (in the case of Clojure, or perhaps native code in
> the case of some Common Lisp implementations and execution by the
> interpreter in interpreted Lisps); if it generates erroneous code
> (like this version of infix!), that erroneous code will be compiled by
> the compiler and eventually explode when you run it -- an unpleasant
> occurrence completely distinct from a macro-expansion-time exception.
>
> Sincerely,
> Michał
>
> --
> 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
> Note that posts from new members are moderated - please be patient with
your first post.
> 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

-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
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