Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
这x是 gensymned ,因为传递给的某些表达式and可以包含x在其中并避免这种冲突。那为什么next不是gensymed呢?不能next导致变量捕获?
x
and
next
(defmacro and ([] true) ([x] x) ([x & next] `(let [and# ~x] (if and# (and ~@next) and#))))
x不是gensymmed,也不应该是。这里的 gensymmed 是and#,它是 gensymmed 的常见原因:它是一个合成绑定,引入到调用者的作用域中,用于宏的内部使用。x并且next不是这些东西:它们不是作为绑定引入的,也不是用于宏的内部使用。它们是调用者提供的代码片段(一个表单和一个表单序列),旨在为调用者的目的而出现在展开的正文中。
and#