我知道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。为什么,如果宏系统应该是卫生的?

最佳答案

宏在定义宏时存在的环境中扩展,而不是在调用宏时存在的环境中扩展。这与卫生无关,这是宏引入的变量与程序中其他地方存在的具有相同名称的其他变量不同的特性。

关于macros - 语法规则不完全卫生吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8927937/

10-11 21:49