Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure模板可变宏_Clojure_Macros - Fatal编程技术网

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
。您的模板定义忽略了名为
&
和passed
fna
的第一个参数,而只使用名为
fns
和passed
fnb
的第二个参数。我想说,如果您正在学习使用
template
,因为希望它有用,请不要费心。除了clojure.test之外,它没有在现实生活中使用,而且它是一个相当有限的工具;知道如何自己编写宏将更好地为您服务。
(println
  (temp/apply-template
    '[x y]
    '(fn [payload] (-> payload x y))
    '[fna fnb]))

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