clojure模板可变宏

时间:2017-03-03 11:51:32

标签: clojure macros

我尝试了以下代码(了解宏):

(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)))

1 个答案:

答案 0 :(得分:1)

这里的例子

不要显示像[& fns]这样的“休息参数”。我认为那是你出错的地方。试试这个:

(println
  (temp/apply-template
    '[x y]
    '(fn [payload] (-> payload x y))
    '[fna fnb]))

=> (fn [payload] (-> payload fna fnb))

顺便说一下,我以前从未见过clojure.template - 它看起来像是一个非常专业的工具。