我正在学习 macros in Racket (Scheme 的语言继承者)。没有提到何时执行宏扩展。在 this 的第 17 页上我发现有一段文字说它发生在类型检查、评估和编译之前。
因此,如果我理解正确,宏扩展会在构建抽象语法树 (AST) 后立即发生吗?
最佳答案
虽然 Racket 专家可能会纠正我,但我的理解是主要阶段是:
换句话说,REPL(读取 eval 打印循环)实际上更像是 REEPL(读取扩展 eval 打印循环)。
有关极端详细信息,请参阅 Language Model包括例如Syntax Model部分。
你提到了“类型检查”。
#lang racket
)是动态类型的,并在运行时进行检查。 #lang typed/racket
)在扩展期间进行静态类型检查:Typed Racket 系统是通过宏实现的。参见 Sam Tobin-Hochstadt 的 dissertation 的第 10 节“实现” . (编辑注意到 JIT 实际上是评估的一部分,而不是一个单独的阶段。)
关于macros - 什么时候进行宏扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21400519/