syntax-rules
在 Scheme 中是“卫生的”和“引用透明的”,并且必须保留 Scheme 的词法范围。据我了解,这意味着在宏扩展阶段,扩展器需要了解lambda
和define
。
- 扩展器需要了解
lambda
. 假设我们有这样的代码:
如果扩展器不知道(define x 1) ((lambda (x) x) 2)
lambda
特殊形式,它会认为两个x
s in(lambda (x) x)
绑定到x
in(define x 1)
,这是不正确的。 - 扩展器需要知道关于
define
,以便它知道在哪里(即在哪个范围内)定义了特定标识符。另外,假设我们有这样的代码:
为了正确确定两者都(define n 1) (define f (lambda (x y) (+ x y))) (define lambda f) (lambda n n)
n
在(lambda n n)
reference 中(define n 1)
,扩展器必须理解(define lambda f)
已经改变了的含义lambda
(因此扩展器必须停止使用特殊规则来处理lmabda
此范围)。
宏扩展器还需要了解哪些其他特殊形式?它需要知道set!
吗?