【发布时间】:2012-04-03 14:18:51
【问题描述】:
举这个(简化的)例子:
(defmacro make [v & body]
`(let [~'nv ~(some-calc v)]
~(map #(if (= % :value) 'nv %) body)))
现在符号nv 是硬编码的。有没有办法以某种方式生成 nv 并且仍然能够在地图功能中使用它?
顺便问一下,这真的是照应宏吗?
【问题讨论】:
-
不确定是否可以称之为照应:如果是这样,
nv应该引用宏调用表单的某些部分。如果你从宏体中提取出some-calc,那么你将有一个更合适的照应调用:(make (some-calc x) (do-something-to nv)),其中nv指的是(some-calc x)。在您的情况下,您将拥有(make x (do-some-thing-to nv)),但随后nv不会直接引用宏调用表单中的任何内容。 -
@skuro:我明白了,所以基本上这是两全其美的 - 引入一个新符号,但它会一直隐藏,直到有人不小心重新定义它。 Hf 跟踪该错误 :) 幸运的是,根据 amalloy 的建议,明确的
gensym解决了这个问题。