首页 > 解决方案 > 为什么 next 不是 gensymed?

问题描述

x是 gensymned ,因为传递给的某些表达式and可以包含x在其中并避免这种冲突。那为什么next不是gensymed呢?不能next导致变量捕获?

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

标签: clojuremacroshygienegensym

解决方案


x不是gensymmed,也不应该是。这里的 gensymmed 是and#,它是 gensymmed 的常见原因:它是一个合成绑定,引入到调用者的作用域中,用于宏的内部使用。x并且next不是这些东西:它们不是作为绑定引入的,也不是用于宏的内部使用。它们是调用者提供的代码片段(一个表单和一个表单序列),旨在为调用者的目的而出现在展开的正文中。


推荐阅读