syntax-rules在 Scheme 中是“卫生的”和“引用透明的”,并且必须保留 Scheme 的词法范围。据我了解,这意味着在宏扩展阶段,扩展器需要了解lambda和define。
- 扩展器需要了解
lambda. 假设我们有这样的代码:
如果扩展器不知道(define x 1) ((lambda (x) x) 2)lambda特殊形式,它会认为两个xs in(lambda (x) x)绑定到xin(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!吗?