【发布时间】:2015-02-16 11:05:38
【问题描述】:
我有一个小宏,它将一系列 cmds 作为 clojure 的表达式并返回它们的字符串表示形式。我无法将参数传递给宏 -
(defmacro cmd [& cmds]
(->> (for [v cmds]
(join " " v))
(join "; ")))
(defn install-jive [version]
(cmd
(yum remove jive-add-ons)
(yum install jive-add-ons ~version)))
(install-jive 1.2)
我希望 fn 返回以下内容 -
(install-jive 1.2) => "yum remove jive-add-ons; yum install jive-add-ons 1.2"
但是目前它返回 -
"yum 删除 jive-add-ons; yum install jive-add-ons (clojure.core/unquote 版本)"
【问题讨论】:
-
问题是宏在定义时被扩展(调用)。当 install-jive 被定义时,你有 ~version 而不是 1.2。
-
@cgrand 我有什么选择?如何构造宏以访问 var ?
-
为什么是宏而不是函数?
-
@Shlomi 因为我希望能够编写 (yum install abc) - 在当前 ns.xml 中没有定义这些符号。有替代品吗?
-
@murtaza52 你必须使用转义机制来区分什么是静态的什么是动态的。您可以使用意外获得的取消引用表单作为转义机制。请参阅我对此类实施的回复。
标签: clojure