语法规则不完全卫生?

jos*_*osh 5 macros scheme syntax-rules

我知道这syntax-rules是一个卫生的宏观系统,但我不明白为什么会发生这种情况:

(define not (lambda (x) x))

(define-syntax nand
  (syntax-rules ()
    ((_ a b)
     (not (and a b)))))

(nand #f #t)

==> #f
Run Code Online (Sandbox Code Playgroud)

现在,如果我not 定义宏重新定义,则(nand #f #t)返回#t. 为什么,如果宏观系统应该是卫生的?

use*_*810 5

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

  • 这个问题也渗透到有关顶级环境的问题中。例如,在 Racket 中,无论哪种方式,您都会得到 #f,因为“not”的定义在所有模块的范围内。不过,就像@user448810 所说的,这不是卫生问题。 (4认同)
  • @ user448810 - “这与卫生无关” - 这并不完全正确。在实践中,引用透明度(这是问题真正要问的问题)通常被称为卫生宏的属性。请参阅:http://community.schemewiki.org/?scheme-faq-macros (2认同)