我在Clojure中遇到了一个与defmacro有关的奇怪问题,我的代码就像
(defmacro ttt
([] (ttt 1))
([a] (ttt a 2))
([a b] (ttt a b 3))
([a b c] `(println ~a ~b ~c)))
Run Code Online (Sandbox Code Playgroud)
我跑(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)
Run Code Online (Sandbox Code Playgroud)
经过一番调查,我明白我应该写
(defmacro ttt
([] `(ttt 1))
([a] `(ttt ~a 2))
([a b] `(ttt ~a ~b 3))
([a b c] `(println ~a ~b ~c)))
Run Code Online (Sandbox Code Playgroud)
但为什么第一个版本失败了?和args太奇怪了了解,其中-1从自带?
为什么
(macroexpand '(.. arm getHand getFinger))
Run Code Online (Sandbox Code Playgroud)
扩展到
(. (. arm getHand) getFinger)
Run Code Online (Sandbox Code Playgroud)
而
(macroexpand '(-> arm getHand getFinger))
Run Code Online (Sandbox Code Playgroud)
扩展到
(getFinger (clojure.core/-> arm getHand))
Run Code Online (Sandbox Code Playgroud)
换句话说,为什么->第二个例子没有完全扩展呢?