macros - 什么时候进行宏扩展?

标签 macros racket

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

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

最佳答案

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

  • A 读取通行证将输入字符处理为语法对象。
  • 扩展 pass 递归扩展语法对象,包括使用用户定义的宏。
  • 评价 . (JIT 编译发生在求值期间,每当调用尚未编译的函数时。)

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

    有关极端详细信息,请参阅 Language Model包括例如Syntax Model部分。

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

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

    关于macros - 什么时候进行宏扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21400519/

    相关文章:

    recursion - 这个 Racket 程序是如何使用 add1 的?

    scheme - 编写Scheme数据结构,以便可以对它们进行eval-d返回,或者替代

    clojure - 使用包含类型提示的宏生成Clojure代码

    clojure/script 将宏扩展为 'def' block 内的多个 'do'

    clojure - Clojure 中的 macroexpand 和 macroexpand-1 有什么区别

    c++ - 标识符和宏有什么区别?

    scheme - 使用 Racket 仅搜索一个列表 "1"

    c - 这个宏包装展示了什么概念?

    racket - BSL(如何设计程序): how to import code from a separate file into definitions area?

    scheme - 是什么决定了连续可以应用的值的数量和类型?