compileTime 编译指示

compileTime 编译指示用来指示一个过程或者变量只能用于编译期的执行。不会为它生成代码。 编译期过程可作为宏的辅助。从语言的 0.12.0 版本开始,包含 system.NimNode 类型的参数的过程隐式地声明为 compileTime:

  1. proc astHelper(n: NimNode): NimNode =
  2. result = n

与下面的代码一致:

  1. proc astHelper(n: NimNode): NimNode {.compileTime.} =
  2. result = n

加了 compileTime 编译指示的变量在运行时也存在。很多时候希望某些变量(例如查找表)在编译时填充数据、 在运行时访问——这轻而易举:

  1. import std/macros
  2. var nameToProc {.compileTime.}: seq[(string, proc (): string {.nimcall.})]
  3. macro registerProc(p: untyped): untyped =
  4. result = newTree(nnkStmtList, p)
  5. let procName = p[0]
  6. let procNameAsStr = $p[0]
  7. result.add quote do:
  8. nameToProc.add((`procNameAsStr`, `procName`))
  9. proc foo: string {.registerProc.} = "foo"
  10. proc bar: string {.registerProc.} = "bar"
  11. proc baz: string {.registerProc.} = "baz"
  12. doAssert nameToProc[2][1]() == "baz"