宏编译指示

有时可以用编译指示语法来调用宏和模板,比如用在例程(过程、迭代器等)声明或例程类型表达式上。编译器执行以下简单的语法转换:

  1. template command(name: string, def: untyped) = discard
  2. proc p() {.command("print").} = discard

转换为:

  1. command("print"):
  2. proc p() = discard

  1. type
  2. AsyncEventHandler = proc (x: Event) {.async.}

转换为:

  1. type
  2. AsyncEventHandler = async(proc (x: Event))

当多个宏编译指示应用于同一个定义时,从左到右的第一个将先被求值。 然后,这个宏可以选择是否在其输出中保留其余的宏编译指示。保留下的那些宏编译指示的求值方式依此类推。

宏指示的应用还有更多,例如在类型、变量和常量声明中, 但这种行为被认为是实验性的,并在 experimental manual 中进行了记录。