summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xlib/core/macros.nim13
-rwxr-xr-xlib/system.nim14
-rwxr-xr-xweb/news.txt8
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
 ==================================