【问题标题】:What Scheme special forms must the hygienic macro expander know about?卫生宏扩展器必须了解哪些Scheme特殊形式?
【发布时间】:2021-12-26 01:37:24
【问题描述】:

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

  • 扩展器需要知道lambda。 假设我们有这样的代码:
    (define x 1)
    ((lambda (x) x) 2)
    
    如果扩展器不知道lambda 特殊形式,它会认为(lambda (x) x) 中的两个xs 绑定到(define x 1) 中的x,这是不正确的。
  • 扩展器需要知道define,以便知道特定标识符的定义位置(即在哪个范围内)。另外,假设我们有这样的代码:
    (define n 1)
    (define f (lambda (x y) (+ x y)))
    (define lambda f)
    (lambda n n)
    
    为了正确判断(lambda n n)中的n都引用(define n 1),扩展器必须明白(define lambda f)已经改变了lambda的含义(因此扩展器必须停止使用特殊规则来处理lmabda 在这个范围内)。

宏扩展器还需要了解哪些其他特殊形式?它需要知道set!吗?

【问题讨论】:

    标签: scheme syntax-rules


    【解决方案1】:

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

    (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))
    >
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2020-11-12
      相关资源
      最近更新 更多