Правила синтаксиса не полностью гигиеничны?

Я это понимаю 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 ответ

Решение

Макрос раскрывается в среде, которая существовала на момент определения макроса, а не в среде, которая существовала на момент вызова макроса. Это не имеет ничего общего с гигиеной, которая является свойством того, что переменные, введенные макросом, отличаются от других переменных с тем же именем, которые существуют в других местах программы.

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