Почему следующий не порицается?
Вот 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
это не что-то из этого: они не представлены как привязки и не предназначены для использования макросом только для внутреннего использования. Это фрагменты кода (форма и последовательность форм), предоставляемые вызывающей стороной, предназначенные для присутствия в расширенном теле для целей вызывающей стороны.