我正在学习macros in Racket(Scheme的语言继承者)。没有提到何时执行宏扩展。在this文档的第17页,我发现了一个段落,说明它在类型检查,评估和编译之前发生。
因此,如果我理解正确,在构建抽象语法树(AST)后会立即进行宏扩展吗?
答案 0 :(得分:8)
虽然Racket专家可能会纠正我,但我的理解是主要阶段是:
读取传递,用于将输入字符处理为语法对象。
扩展传递递归扩展语法对象,包括使用用户定义的宏。
<强>评价即可。 (只要调用了尚未编译的函数,JIT编译就会在评估期间发生。)
换句话说,REPL(读取eval打印循环)实际上更像是REEPL(读取扩展eval打印循环)。
对于极端详细程度,请参阅Language Model,例如: Syntax Model部分。
您提到了“类型检查”。
#lang racket
)是动态类型的,并且在运行时进行检查。#lang typed/racket
)在扩展期间执行静态类型检查:Typed Racket系统通过宏实现。参见Sam Tobin-Hochstadt的dissertation的第10节“实施”。(编辑注意JIT实际上是评估的一部分,而不是一个单独的阶段。)