【发布时间】:2010-05-28 05:10:27
【问题描述】:
对于 clojure 宏何时会发生符号捕获,我有点困惑。假设我有一个从关键字定义函数的宏。在这个简单的例子中,
(defmacro foo [keywd1 keywd2] `(defn ~(symbol (name keywd1))
[~(symbol (name keywd2))] (* 2 ~(symbol (name keywd2)))))
我调用 (foo :bar :baz),它被扩展为 (defn bar [baz] (* 2 baz))。
所以现在的问题是——这会导致符号捕获吗?如果有,在什么情况下? 我知道最好使用 gensym(例如 bar#)来防止符号捕获,但在某些情况下(不是很多,但仍然)我希望有一个漂亮的宏扩展,没有自动生成的符号。
额外问题:如果我们正在考虑创建宏的宏,答案会改变吗?
【问题讨论】:
标签: macros clojure symbol-capture