1

syntax-rules在 Scheme 中是“卫生的”和“引用透明的”,并且必须保留 Scheme 的词法范围。据我了解,这意味着在宏扩展阶段,扩展器需要了解lambdadefine

  • 扩展器需要了解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!吗?

4

1 回答 1

0

这些示例似乎是关于词法范围的,而不是宏扩展。

(define x 1)
((lambda (x) x) 2)

第二行中 x 的绑定影响了第一行中的绑定。

同样,在第二个示例中,在定义之后的区域中(define lambda f)绑定lambda ;没有宏扩展。

标识符lambda 可以用作句法扩展(宏)中的关键字;词法作用域通常适用,没有特殊规则:

> (let-syntax ([lambda (syntax-rules ()
        [(lambda arg) ((lambda (x) (+ 1 x)) arg)])])
    (lambda 2))
3
>

但:

> (letrec-syntax ([lambda (syntax-rules ()
        [(lambda arg) ((lambda (x) (+ 1 x)) arg)])])
    (lambda 2))
Exception: invalid syntax (lambda (x) (+ 1 x))
>
于 2021-11-22T18:00:39.960 回答