Правила синтаксиса не полностью гигиеничны?
Я это понимаю syntax-rules
это гигиеническая макросистема, но я не понимаю, почему это происходит:
(define not (lambda (x) x))
(define-syntax nand
(syntax-rules ()
((_ a b)
(not (and a b)))))
(nand #f #t)
==> #f
Теперь, если бы я переопределил not
после определения макроса, то (nand #f #t)
возвращается #t
, Почему, если макросистема должна быть гигиеничной?
1 ответ
Решение
Макрос раскрывается в среде, которая существовала на момент определения макроса, а не в среде, которая существовала на момент вызова макроса. Это не имеет ничего общего с гигиеной, которая является свойством того, что переменные, введенные макросом, отличаются от других переменных с тем же именем, которые существуют в других местах программы.