何时进行宏扩展?

时间:2014-01-28 08:35:50

标签: macros racket

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

因此,如果我理解正确,在构建抽象语法树(AST)后会立即进行宏扩展吗?

1 个答案:

答案 0 :(得分:8)

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

  1. 读取传递,用于将输入字符处理为语法对象。

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

  3. <强>评价即可。 (只要调用了尚未编译的函数,JIT编译就会在评估期间发生。)

  4. 换句话说,REPL(读取eval打印循环)实际上更像是REEPL(读取扩展eval打印循环)。

    对于极端详细程度,请参阅Language Model,例如: Syntax Model部分。

    您提到了“类型检查”。

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

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