Почему следующий не порицается?

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

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

1 ответ

Решение

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

Другие вопросы по тегам