这里x
是通用的,因为传递给and
的某些表达式可以包含x
,以避免这种冲突。那为什么next
不是玄机呢?next
不能导致变量捕获吗?
(defmacro and
([] true)
([x] x)
([x & next]
`(let [and# ~x]
(if and# (and ~@next) and#))))
x
不是gensymed,也不应该是。这里的 gensymmed 是 and#
,出于通常的原因,它是 gensymmed 的:它是一个引入到调用者作用域中的合成绑定,供宏仅在内部使用。 x
和next
都不是这些东西:它们不是作为绑定引入的,也不是用于宏的仅内部使用。它们是调用方提供的代码片段(表单和表单序列(,旨在存在于扩展的正文中,供调用方使用。