【发布时间】:2014-10-23 08:09:12
【问题描述】:
我在 Clojure 中遇到了一个与 defmacro 相关的奇怪问题,我有类似的代码
(defmacro ttt
([] (ttt 1))
([a] (ttt a 2))
([a b] (ttt a b 3))
([a b c] `(println ~a ~b ~c)))
我用(ttt) 运行,它应该变成(println 1 2 3),并打印“1 2 3”,但我得到的是
ArityException Wrong number of args (-1) passed to: t1$ttt clojure.lang.Compiler.macroexpand1 (Compiler.java:6473)
经过一番调查,我明白我应该写
(defmacro ttt
([] `(ttt 1))
([a] `(ttt ~a 2))
([a b] `(ttt ~a ~b 3))
([a b c] `(println ~a ~b ~c)))
但是为什么第一个版本失败了?而args太奇怪了,看不懂,-1是哪里来的?
【问题讨论】: