【发布时间】:2017-03-03 11:51:31
【问题描述】:
我尝试了以下代码(学习宏):
(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)))
【问题讨论】:
-
我想说,如果您正在学习使用
template,因为您希望它有用,请不要打扰。它没有在 clojure.test 之外的现实生活中使用,而且它是一个相当有限的工具;知道如何自己编写宏将为您提供更好的服务。