我正在尝试在函数中写一个类似(我认为)的宏来处理线程宏,但是这样我就可以指定一个关键字,其中前一个表单的插入会发生。我打算使用clojure.walk / prewalk-replace,但我得到了一个clojure.lang.ArityException。这是代码:
(defmacro streamops [data form]
(let [keewurd :...]
(cond
(not (seq? form)) form
(= (count form) 0) data
:else (streamops ~(clojure.walk/prewalk-replace
{keewurd data} (first form))
~(rest form)))))`
但是当我尝试应用单元测试时:
(= (macroexpand '(streamops 3 ( (+ 1 :...) (* :... 2))))
'(* (+ 1 3) 2))
它产生:
clojure.lang.ArityException: Wrong number of args (-1) passed to: walk$prewalk-replace
Compiler.java:6473 clojure.lang.Compiler.macroexpand1
core.clj:3633 clojure.core/macroexpand-1
core.clj:3642 clojure.core/macroexpand
我做错了什么?
答案 0 :(得分:1)
您的宏的定义中似乎有一个错误的语法引用`
,因为它放在您发布的代码的末尾,但是没有语法引用您使用非引号~
的表单。
以下工作正常:
(defmacro streamops [data form]
(let [keewurd :...]
(cond
(not (seq? form)) form
(= (count form) 0) data
:else `(streamops ~(clojure.walk/prewalk-replace
{keewurd data} (first form))
~(rest form)))))
(= (macroexpand '(streamops 3 ( (+ 1 :...) (* :... 2))))
'(* (+ 1 3) 2))
;= true