правила синтаксиса не полностью гигиеничны? - PullRequest
4 голосов
/ 19 января 2012

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

4 голосов
/ 19 января 2012

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

...