clojure模板可变宏
我尝试了以下代码(学习宏): 正如我所期望的那样,我对输出感到惊讶:clojure模板可变宏,clojure,macros,Clojure,Macros,我尝试了以下代码(学习宏): 正如我所期望的那样,我对输出感到惊讶: (fn [payload] (-> payload fna fnb)) 它为什么会产生这种产出,实现上述目标的方法是什么?我在文件中特别提到: argv是一个参数列表,如defn中所示 注意:可以这样写,但我试图理解如何使用模板: (defmacro wrap-fn-> [& fns] `(fn [~'x#] (-> ~'x ~@fns))) 这里的例子 不
(fn [payload] (-> payload fna fnb))
它为什么会产生这种产出,实现上述目标的方法是什么?我在文件中特别提到:
argv是一个参数列表,如defn中所示
注意:可以这样写,但我试图理解如何使用模板:
(defmacro wrap-fn-> [& fns]
`(fn [~'x#]
(-> ~'x
~@fns)))
这里的例子
[&fns]
那样显示“rest参数”的用法。我认为这就是你错的地方。试试这个:
(println
(temp/apply-template
'[x y]
'(fn [payload] (-> payload x y))
'[fna fnb]))
=> (fn [payload] (-> payload fna fnb))
顺便说一句,我以前从未见过使用
clojure.template
,它看起来像一个非常专业的工具。是的,它会这样工作,但对于固定数量的fns
,我试图使它采用可变数量的参数。注意,这是为了学习(在查看clojure.test源代码之前从未见过)。实际上,我会使用defmacro
获取数量可变的参数,并将其传递给apply template
。这纯粹是好奇(到目前为止)。此外,我不明白为什么它需要fnb
而不是fna
。它“需要”fnb
,因为[&fns]
是一个包含两个符号的参数列表,&
和fns
。您的模板定义忽略了名为&
和passedfna
的第一个参数,而只使用名为fns
和passedfnb
的第二个参数。我想说,如果您正在学习使用template
,因为希望它有用,请不要费心。除了clojure.test之外,它没有在现实生活中使用,而且它是一个相当有限的工具;知道如何自己编写宏将更好地为您服务。
(println
(temp/apply-template
'[x y]
'(fn [payload] (-> payload x y))
'[fna fnb]))
=> (fn [payload] (-> payload fna fnb))