macros - 语法规则不完全卫生?

标签 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

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

最佳答案

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

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

相关文章:

c - #define 应该在宏周围添加空格吗?

scheme - 为什么 DrRacket 似乎将此识别为尾调用?

macros - 如何控制Scheme宏展开的顺序?

macros - 方案:如何在不带括号的语法规则中扩展具有多个变量的模式

c++ - 如何使用 QTest QBENCHMARK 宏结果作为单元测试中的参数

macros - 如何防止 lisp 宏中的表单评估?

macros - 如何在一个宏调用中分配多个常量

scheme - 循环形式的命名 let 是如何工作的?

functional-programming - SICP DrScheme 中的哪种语言?

macros - 语法规则中如何使用矢量模式?