何时进行宏扩展?

The*_*Kid 4 macros racket

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

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

Gre*_*ott 8

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

  1. 读取通过处理所述输入的字符成语法对象.

  2. 一个膨胀通该递归扩展的语法对象,包括使用用户定义的宏.

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

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

有关极端详细信息,请参阅语言模型,包括例如语法模型部分.

你提到了"类型检查".

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

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