Почему следующий не порицается? - PullRequest
0 голосов
/ 07 июня 2019

Здесь x является симметричным, потому что некоторое выражение, переданное and, может содержать x и избежать этого конфликта.Тогда почему next не является Генсимедом?Не может next привести к захвату переменной?

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

1 Ответ

3 голосов
/ 07 июня 2019

x не является симметричным и не должно быть. В данном случае используется выражение gensymmed and#, которое по обычной причине является gensymmed: это синтетическая привязка, введенная в область действия вызывающей стороны для использования макроса только для внутреннего использования. x и next не являются ни одной из этих вещей: они не представлены как привязки и не предназначены для использования макросом только для внутреннего использования. Это фрагменты кода (форма и последовательность форм), предоставляемые вызывающей стороной, которые должны присутствовать в расширенном теле для целей вызывающей стороны.

...