为什么下一个不被gensymed?

时间:2019-06-07 17:01:53

标签: clojure macros hygiene gensym

这里x是带符号的,因为传递给and的某些表达式可以包含x并避免该冲突。那么为什么next没有被gensymed? next是否会导致变量捕获?

(defmacro and 
  ([] true)
  ([x] x)
  ([x & next]
    `(let [and# ~x]
      (if and# (and ~@next) and#))))

1 个答案:

答案 0 :(得分:3)

x没有被sysymmed,也不应该。此处的gensymmed内容是and#,由于通常的原因而被gensymmed了:它是为宏的仅供内部使用而引入到调用方作用域中的综合绑定。 xnext都不是这些东西:它们不是作为绑定引入的,也不是为宏内部专用而使用的。它们是调用者提供的代码片段(一种形式和一系列形式),旨在出现在扩展主体中,以用于调用者的目的。