【发布时间】:2014-02-19 10:50:55
【问题描述】:
我正在学习macros in Racket(Scheme 的语言继承者)。没有提及何时执行宏扩展。在this 文档的第 17 页上,我发现了一段说它发生在类型检查、评估和编译之前。
所以如果我理解正确,宏扩展是在构建抽象语法树(AST)之后立即发生的?
【问题讨论】:
我正在学习macros in Racket(Scheme 的语言继承者)。没有提及何时执行宏扩展。在this 文档的第 17 页上,我发现了一段说它发生在类型检查、评估和编译之前。
所以如果我理解正确,宏扩展是在构建抽象语法树(AST)之后立即发生的?
【问题讨论】:
虽然球拍专家可能会纠正我,但我的理解是主要阶段是:
将输入字符处理成语法对象的读取通道。
递归扩展语法对象的扩展传递,包括使用用户定义的宏。
评估。 (JIT 编译发生在评估期间,只要调用尚未编译的函数。)
换句话说,REPL(读取评估打印循环)实际上更像是一个 REEPL(读取扩展评估打印循环)。
有关极端详细信息,请参阅Language Model,包括例如Syntax Model 部分。
您提到了“类型检查”。
#lang racket)是动态类型的,并在运行时进行检查。#lang typed/racket)在扩展期间进行静态类型检查:Typed Racket 系统是通过宏实现的。请参阅 Sam Tobin-Hochstadt 的dissertation 第 10 节“实施”。(编辑指出 JIT 实际上是评估的一部分,而不是一个单独的阶段。)
【讨论】: