这里x
是带符号的,因为传递给and
的某些表达式可以包含x
并避免该冲突。那么为什么next
没有被gensymed? next
是否会导致变量捕获?
(defmacro and
([] true)
([x] x)
([x & next]
`(let [and# ~x]
(if and# (and ~@next) and#))))
答案 0 :(得分:3)
x
没有被sysymmed,也不应该。此处的gensymmed内容是and#
,由于通常的原因而被gensymmed了:它是为宏的仅供内部使用而引入到调用方作用域中的综合绑定。 x
和next
都不是这些东西:它们不是作为绑定引入的,也不是为宏内部专用而使用的。它们是调用者提供的代码片段(一种形式和一系列形式),旨在出现在扩展主体中,以用于调用者的目的。