【问题标题】:When is macro expansion performed?何时执行宏扩展?
【发布时间】:2014-02-19 10:50:55
【问题描述】:

我正在学习macros in Racket(Scheme 的语言继承者)。没有提及何时执行宏扩展。在this 文档的第 17 页上,我发现了一段说它发生在类型检查、评估和编译之前。

所以如果我理解正确,宏扩展是在构建抽象语法树(AST)之后立即发生的?

【问题讨论】:

    标签: macros racket


    【解决方案1】:

    虽然球拍专家可能会纠正我,但我的理解是主要阶段是:

    1. 将输入字符处理成语法对象的读取通道

    2. 递归扩展语法对象的扩展传递,包括使用用户定义的宏。

    3. 评估。 (JIT 编译发生在评估期间,只要调用尚未编译的函数。)

    换句话说,REPL(读取评估打印循环)实际上更像是一个 REEPL(读取扩展评估打印循环)。

    有关极端详细信息,请参阅Language Model,包括例如Syntax Model 部分。

    您提到了“类型检查”。

    • Plain Racket(例如 #lang racket)是动态类型的,并在运行时进行检查。
    • Typed Racket(例如#lang typed/racket)在扩展期间进行静态类型检查:Typed Racket 系统是通过宏实现的。请参阅 Sam Tobin-Hochstadt 的dissertation 第 10 节“实施”。

    (编辑指出 JIT 实际上是评估的一部分,而不是一个单独的阶段。)

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多