compileTime pragma

The compileTime pragma is used to mark a proc or variable to be used only during compile-time execution. No code will be generated for it. Compile-time procs are useful as helpers for macros. Since version 0.12.0 of the language, a proc that uses system.NimNode within its parameter types is implicitly declared compileTime:

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

Is the same as:

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

compileTime variables are available at runtime too. This simplifies certain idioms where variables are filled at compile-time (for example, lookup tables) but accessed at runtime:

  1. import 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"