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 に答える