我尝试了以下代码(了解宏):
(require '[clojure.template :as temp])
(defn fna [x] (println "a" x) x)
(defn fnb [x] (println "b" x) x)
(temp/apply-template '[& fns]
'(fn [payload] (-> payload fns))
'[fna fnb])
;; returns (fn [payload] (-> payload fnb))
我对输出感到惊讶,正如我所期待的那样:
(fn [payload] (-> payload fna fnb))
为什么会产生这种输出,以及实现上述目标的方法是什么?我在文档中特别说:
argv是一个参数列表,如defn。
注意:它可以这样编写,但我试图了解如何使用模板:
(defmacro wrap-fn-> [& fns]
`(fn [~'x#]
(-> ~'x
~@fns)))
答案 0 :(得分:1)
这里的例子
不要显示像[& fns]
这样的“休息参数”。我认为那是你出错的地方。试试这个:
(println
(temp/apply-template
'[x y]
'(fn [payload] (-> payload x y))
'[fna fnb]))
=> (fn [payload] (-> payload fna fnb))
顺便说一下,我以前从未见过clojure.template
- 它看起来像是一个非常专业的工具。