Hi Kevin! Your (let [dummy 0] ...) is a single expression and, as such, is entirely compiled before being executed. But to properly compile (add 1 (mul magic x)) 'add need to have a value and it will not have a value until the (compiled) expression is executed. So, for this expression, its compilation depends on its execution that requires its compilation...
Thus a macro can on only be used in subsequent op-level expression, not in its own. I just learnt this lesson again: http://clj-me.blogspot.com/2009/04/vicious-bug.html hth, Christophe ke...@ksvanhorn.com a écrit : > I have more information on this now, and it is definitely a bug in > Clojure -- defmacro within a let doesn't work correctly. Consider the > following file: > > --- BEGIN foo1a.coj --- > (ns com.ksvanhorn.foo1a) > > (let [dummy 0] > (defmacro add [& args] `(unchecked-add ~...@args)) > (defmacro mul [& args] `(unchecked-multiply ~...@args)) > (let [magic 1812433253 > x 5489 > v (add 1 (mul magic x))] > (println (str "v: " v)))) > --- END --- > > If I type "(use 'com.ksvanhorn.foo1a)" at the REPL, I get > > v: (clojure.core/unchecked-add 1 (clojure.core/unchecked-multiply > 1812433253 5489)) > > printed out and nil returned, but if I just type > > (uncheck-add 1 (unchecked-multiply 1812433253 5489)) > > I get 1301868182. > > Although in this case the defmacro doesn't need to be inside the let, > I actually have a real need for doing defmacro inside a let -- I have > a computed constant that I want to use in several places, and one of > those places is in the macro definition. > > > > > -- Professional: http://cgrand.net/ (fr) On Clojure: http://clj-me.blogspot.com/ (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 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 -~----------~----~----~----~------~----~------~--~---