2

我正在尝试编写一个与线程宏功能相似(我认为)的宏,但是这将允许我指定一个关键字,其中前一个表单的插入将发生。我计划使用 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

我究竟做错了什么?

4

1 回答 1

1

您的宏定义中似乎有一个错误的语法引用`,因为它位于您发布的代码的末尾,但是在您使用 unquote 的形式中没有语法引用~

以下工作正常:

(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
于 2014-04-01T06:11:04.973 回答