diff options
-rwxr-xr-x | lib/core/macros.nim | 13 | ||||
-rwxr-xr-x | lib/system.nim | 14 | ||||
-rwxr-xr-x | web/news.txt | 8 |
3 files changed, 34 insertions, 1 deletions
diff --git a/lib/core/macros.nim b/lib/core/macros.nim index 4d13a076d..e8a16865e 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 b75f9022d..bfaa5eb8f 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 a171f1068..fdf3a63ea 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 ================================== |