16 Macros🔗

一个 macro 是一个语法形式,具有相关联的 transformer,它将原始形式展开为已有的形式。换句话说,宏是 Racket 编译器的扩展。racket/base 和 racket 的大多数语法形式实际上都是 macro,它们展开为一小部分核心结构。

像许多语言一样,Racket 提供了基于模式的宏,使得简单的转换易于实现且可靠使用。Racket还支持任意宏 transformer,它们用 Racket(或用宏扩展的 Racket 变体)实现。

本章提供了 Racket 宏的入门知识,但另请参见 Fear of Macros,它从一个不同的视角提供了介绍。

Racket 还包含对宏开发的额外支持:一个 宏调试器,便于经验丰富的程序员调试其宏以及供新手研究其行为,以及 syntax/parse 库,用于编写宏和指定语法,可自动验证宏的使用并报告语法错误。

    16.1 Pattern-Based Macros

      16.1.1 define-syntax-rule

      16.1.2 Lexical Scope

      16.1.3 define-syntax and syntax-rules

      16.1.4 Matching Sequences

      16.1.5 Identifier Macros

      16.1.6 set! Transformers

      16.1.7 Macro-Generating Macros

      16.1.8 Extended Example: Call-by-Reference Functions

    16.2 General Macro Transformers

      16.2.1 Syntax Objects

      16.2.2 Macro Transformer Procedures

      16.2.3 Mixing Patterns and Expressions: syntax-case

      16.2.4 with-syntax and generate-temporaries

      16.2.5 Compile and Run-Time Phases

      16.2.6 General Phase Levels

        16.2.6.1 Phases and Bindings

        16.2.6.2 Phases and Modules

      16.2.7 Tainted Syntax

    16.3 Module Instantiations and Visits

      16.3.1 Declaration versus Instantiation

      16.3.2 Compile-Time Instantiation

      16.3.3 Visiting Modules

      16.3.4 Lazy Visits via Available Modules