为什么下一个不是狡猾的



这里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 的:它是一个引入到调用者作用域中的合成绑定,供宏仅在内部使用。 xnext都不是这些东西:它们不是作为绑定引入的,也不是用于宏的仅内部使用。它们是调用方提供的代码片段(表单和表单序列(,旨在存在于扩展的正文中,供调用方使用。

最新更新