为什么 next 不是 gensymed?
Why is next not gensymed?
这里 x
是 gensymned 因为传递给 and
的某些表达式可以包含 x
并避免冲突。那为什么 next
没有生成?不能 next
导致变量捕获吗?
(defmacro and
([] true)
([x] x)
([x & next]
`(let [and# ~x]
(if and# (and ~@next) and#))))
x
不是 gensymmed,也不应该是。这里的 gensymmed 是 and#
,它是 gensymmed 的通常原因:它是一个合成绑定,引入到调用者范围内,用于宏的 internal-only 用法。 x
和 next
是这些东西的 none:它们不是作为绑定引入的,也不是用于宏的 internal-only 用法。它们是由调用者提供的代码片段(一种形式和一系列形式),旨在为调用者的目的出现在扩展体中。
这里 x
是 gensymned 因为传递给 and
的某些表达式可以包含 x
并避免冲突。那为什么 next
没有生成?不能 next
导致变量捕获吗?
(defmacro and
([] true)
([x] x)
([x & next]
`(let [and# ~x]
(if and# (and ~@next) and#))))
x
不是 gensymmed,也不应该是。这里的 gensymmed 是 and#
,它是 gensymmed 的通常原因:它是一个合成绑定,引入到调用者范围内,用于宏的 internal-only 用法。 x
和 next
是这些东西的 none:它们不是作为绑定引入的,也不是用于宏的 internal-only 用法。它们是由调用者提供的代码片段(一种形式和一系列形式),旨在为调用者的目的出现在扩展体中。