diff options
author | Araq <rumpf_a@web.de> | 2013-04-13 21:55:02 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2013-04-13 21:55:02 +0200 |
commit | 75b508032b9da285f30d4ec7f2af4c63075b8611 (patch) | |
tree | 79476c0e8b7c70ee373bde21a2ea0a62d84520f8 /tests/manyloc/keineschweine/dependencies/genpacket/macro_dsl.nim | |
parent | 4f09794be9fb9b96728078712f01e990e0021929 (diff) | |
download | Nim-75b508032b9da285f30d4ec7f2af4c63075b8611.tar.gz |
added manyloc test suite; --path now relative to project dir if not absolute
Diffstat (limited to 'tests/manyloc/keineschweine/dependencies/genpacket/macro_dsl.nim')
-rw-r--r-- | tests/manyloc/keineschweine/dependencies/genpacket/macro_dsl.nim | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/tests/manyloc/keineschweine/dependencies/genpacket/macro_dsl.nim b/tests/manyloc/keineschweine/dependencies/genpacket/macro_dsl.nim new file mode 100644 index 000000000..cbae1334e --- /dev/null +++ b/tests/manyloc/keineschweine/dependencies/genpacket/macro_dsl.nim @@ -0,0 +1,73 @@ +import macros +{.deadCodeElim: on.} +#Inline macro.add() to allow for easier nesting +proc und*(a: PNimrodNode; b: PNimrodNode): PNimrodNode {.compileTime.} = + a.add(b) + result = a +proc und*(a: PNimrodNode; b: varargs[PNimrodNode]): PNimrodNode {.compileTime.} = + a.add(b) + result = a + +proc `^`*(a: string): PNimrodNode {.compileTime.} = + ## new ident node + result = newIdentNode(!a) +proc `[]`*(a, b: PNimrodNode): PNimrodNode {.compileTime.} = + ## new bracket expression: node[node] not to be confused with node[indx] + result = newNimNode(nnkBracketExpr).und(a, b) +proc `:=`*(left, right: PNimrodNode): PNimrodNode {.compileTime.} = + ## new Asgn node: left = right + result = newNimNode(nnkAsgn).und(left, right) + +proc lit*(a: string): PNimrodNode {.compileTime.} = + result = newStrLitNode(a) +proc lit*(a: int): PNimrodNode {.compileTime.} = + result = newIntLitNode(a) +proc lit*(a: float): PNimrodNode {.compileTime.} = + result = newFloatLitNode(a) +proc lit*(a: char): PNimrodNode {.compileTime.} = + result = newNimNode(nnkCharLit) + result.intval = a.ord + +proc emptyNode*(): PNimrodNode {.compileTime.} = + result = newNimNode(nnkEmpty) + +proc dot*(left, right: PNimrodNode): PNimrodNode {.compileTime.} = + result = newNimNode(nnkDotExpr).und(left, right) +proc postfix*(a: PNimrodNode, b: string): PNimrodNode {.compileTime.} = + result = newNimNode(nnkPostfix).und(newIdentNode(!b), a) +proc prefix*(a: string, b: PNimrodNode): PNimrodNode {.compileTime.} = + result = newNimNode(nnkPrefix).und(newIdentNode(!a), b) + +proc infix*(a, b, c: PNimrodNode): PNimrodNode {.compileTime.} = + ## 5.infix("+", 10) ## => 5 + 10 + result = newNimNode(nnkInfix).und(b, a, c) +proc infix*(a: PNimrodNode; b: string; c: PNimrodNode): PNimrodNode {.compileTime.} = + ## Infix operation: infix(5, "+", 10) ## => + result = newNimNode(nnkInfix).und(newIdentNode(b), a, c) + +proc quoted2ident*(a: PNimrodNode): PNimrodNode {.compileTime.} = + if a.kind != nnkAccQuoted: + return a + var pname = "" + for piece in 0..a.len - 1: + pname.add($a[piece].ident) + result = ^pname + + +macro `?`(a: expr): expr = + ## Character literal ?A #=> 'A' + result = ($a[1].ident)[0].lit +## echo(?F,?a,?t,?t,?y) + +when isMainModule: + macro foo(x: stmt): stmt = + result = newNimNode(nnkStmtList) + result.add(newNimNode(nnkCall).und(!!"echo", "Hello thar".lit)) + result.add(newCall("echo", lit("3 * 45 = "), (3.lit.infix("*", 45.lit)))) + let stmtlist = x[1] + for i in countdown(len(stmtlist)-1, 0): + result.add(stmtlist[i]) + foo: + echo y, " * 2 = ", y * 2 + let y = 320 + |