If you've ever had a confusing 
ArityException<http://clojure-log.n01se.net/date/2013-10-16.html#19:37> while 
working with macros, the reason may be that 
clojure.lang.Compiler.macroexpand1 rethrows any 
ArityExceptions<https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L6475>it
 catches from a call to a macro, in order to reduce the number of 
arguments reported.  This messes up the stack, potentially destroying 
information about where the ArityException occurred if it did not occur 
from the call to the macro itself.  For instance:

user> (do (defn inner [] (assoc)) (defmacro f [] (inner)) (f))
ArityException Wrong number of args (-2) passed to: core$assoc 
 clojure.lang.Compiler.macroexpand1 (Compiler.java:6488)
user> (use 'clojure.repl) (pst)
nil
ArityException Wrong number of args (-2) passed to: core$assoc
clojure.lang.Compiler.macroexpand1 (Compiler.java:6488)
clojure.lang.Compiler.macroexpand (Compiler.java:6544)
clojure.lang.Compiler.eval (Compiler.java:6618)
clojure.lang.Compiler.eval (Compiler.java:6624)
clojure.lang.Compiler.eval (Compiler.java:6597)
clojure.core/eval (core.clj:2864)
clojure.main/repl/read-eval-print--6596/fn--6599 (main.clj:260)
clojure.main/repl/read-eval-print--6596 (main.clj:260)
clojure.main/repl/fn--6605 (main.clj:278)
clojure.main/repl (main.clj:278)
clojure.tools.nrepl.middleware.interruptible-eval/evaluate/fn--1251 
(interruptible_eval.clj:56)
clojure.core/apply (core.clj:617)
nil
user> 


Note that the call to inner is not in the stack trace, and the number of 
arguments to it have been reduced by 2, leading to a nonsensical result in 
this case.

The patch at http://dev.clojure.org/jira/browse/CLJ-1279 fixes this bug. 
 Might save you some time, if you're developing macros.

Best regards,
Alex

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
[email protected]
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 unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to