宏是一种在编译时运行的特殊函数。通常,宏的输入是所传入的代码的抽象语法树(AST)。 宏然后可以对其执行转换,并将转换后的 AST 结果返回。 可以用来添加自定义的语言功能,实现 domain-specific languages “领域特定语言”。

宏的调用是一种特殊情况,语义分析并完全是自顶向下、从左到右的。相反,语义分析至少发生两次:

  • 语义分析识别并解析宏调用。
  • 编译器执行宏正文(可能会调用其他过程)。
  • 将宏调用的 AST 替换为宏返回的 AST。
  • 再次对该区域的代码进行语义分析。
  • 如果宏返回的 AST 包含其他宏调用,则迭代执行。

虽然宏支持高级的编译时代码转换,但无法更改 Nim 的语法。

风格说明: 为了代码的可读性,最好选用最弱的但又能满足需要的编程结构。建议如下:

  1. 尽可能使用常规的过程和迭代器。
  2. 其次尽可能使用泛型过程和迭代器。
  3. 再次尽可能使用模板。
  4. 最后才考虑使用宏。