From a3f16968a75e3a9b254b6fac7820fea83debd1e8 Mon Sep 17 00:00:00 2001 From: Zahary Karadjov Date: Fri, 24 Feb 2012 16:24:39 +0200 Subject: [PATCH] helper templates static, eval and emit for easier compile-time code evaluation --- lib/core/macros.nim | 13 ++++++++++++- lib/system.nim | 14 ++++++++++++++ web/news.txt | 8 ++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/core/macros.nim b/lib/core/macros.nim index 4d13a076d9..e8a16865e4 100755 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -208,7 +208,18 @@ proc getAst*(macroOrTemplate: expr): expr {.magic: "ExpandToAst".} ## ## macro FooMacro() = ## var ast = getAst(BarTemplate()) - + +template emit*(s: expr): stmt = + ## accepts a single sting argument and treats it as nimrod code + ## that should be inserted verbatim in the program + ## Example: + ## + ## emit("echo " & '"' & "hello world".toUpper & '"') + ## + block: + const evaluated = s + eval: result = evaluated.parseStmt + proc expectKind*(n: PNimrodNode, k: TNimrodNodeKind) {.compileTime.} = ## checks that `n` is of kind `k`. If this is not the case, ## compilation aborts with an error message. This is useful for writing diff --git a/lib/system.nim b/lib/system.nim index b75f9022dd..bfaa5eb8fa 100755 --- a/lib/system.nim +++ b/lib/system.nim @@ -2213,6 +2213,20 @@ proc shallow*(s: var string) {.noSideEffect, inline.} = var s = cast[PGenericSeq](s) s.reserved = s.reserved or seqShallowFlag +template static*(e: expr): expr = + ## evaluates a given expression `e` at compile-time + ## even if it has side effects + block: + const res = e + res + +template eval*(blk: stmt): stmt = + ## executes a block of code at compile time just as if it was a macro + ## optonally, the block can return an AST tree that will replace the + ## eval expression + block: + macro payload(x: stmt): stmt = blk + payload() when defined(initDebugger): initDebugger() diff --git a/web/news.txt b/web/news.txt index a171f1068e..fdf3a63ea8 100755 --- a/web/news.txt +++ b/web/news.txt @@ -20,6 +20,14 @@ Library Additions - Added ``system.shallow`` that can be used to speed up string and sequence assignments. +- Added ``system.static`` that can force compile-time evaluation of certain + expressions + +- Added ``system.eval`` that can execute an anonymous block of code at + compile time as if was a macro + +- Added ``macros.emit`` that can emit an arbitrary computed string as nimrod + code during compilation 2012-02-09 Version 0.8.14 released ==================================