【发布时间】:2011-07-12 16:25:19
【问题描述】:
我有两个宏。第一个将符号作为唯一参数(因为它被传递给 def,它需要一个符号)。第二个函数需要一个符号列表,并且应该单独调用第一个符号和每个符号。
(defmacro m1 [s]
'(let [f# ... dynamic function definition ...]
(def ~s f#))
第二个宏应该获取一个符号列表并将它们传递给第一个,但我无法让它工作。我能想到的最好的方法如下:
(defmacro m2 [symbols]
`(for [s# ~symbols] (eval (read-string (str "(name.of.current.namespace/m1 " s# ")")))))
这会强制 s# 在传递给第一个宏之前对其进行评估。它也被一个字符串列表调用,而不是一个符号列表。
这对于我正在使用的库很有用,该库中的所有函数都采用相同的两个第一个参数。我正在尝试在我的命名空间中为一些函数创建包装函数,这些函数会自动提供前两个参数值,它们都是通用的。
有什么改进的方法吗?
【问题讨论】:
-
为什么这里不能选择普通的 fn?类似于
(defn m2fun [symbols] (map m1 symbols)) -
你可以只使用部分吗?我真的不明白问题出在哪里。