From a5e2db2ac53aa61d0e050ee6487e38c647eb442d Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Thu, 5 Sep 2019 11:56:32 +0200 Subject: allows access to .compileTime vars at runtime (#12128) --- doc/manual.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'doc') diff --git a/doc/manual.rst b/doc/manual.rst index a8326d94d..3c194b1d2 100644 --- a/doc/manual.rst +++ b/doc/manual.rst @@ -5928,6 +5928,31 @@ Is the same as: proc astHelper(n: NimNode): NimNode {.compileTime.} = 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: + +.. code-block:: nim + :test: "nim c -r $1" + + import macros + + var nameToProc {.compileTime.}: seq[(string, proc (): string {.nimcall.})] + + macro registerProc(p: untyped): untyped = + result = newTree(nnkStmtList, p) + + let procName = p[0] + let procNameAsStr = $p[0] + result.add quote do: + nameToProc.add((`procNameAsStr`, `procName`)) + + proc foo: string {.registerProc.} = "foo" + proc bar: string {.registerProc.} = "bar" + proc baz: string {.registerProc.} = "baz" + + doAssert nameToProc[2][1]() == "baz" + noReturn pragma --------------- -- cgit 1.4.1-2-gfad0