相关疑难解决方法(0)

clojure defmacro中的多个arity

我在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从自带?

macros clojure

23
推荐指数
1
解决办法
2904
查看次数

Clojure宏扩展

为什么

(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)

换句话说,为什么->第二个例子没有完全扩展呢?

macros clojure

8
推荐指数
1
解决办法
1610
查看次数

标签 统计

clojure ×2

macros ×2