1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
import macros
#Inline macro.add() to allow for easier nesting
proc und*(a: NimNode; b: NimNode): NimNode {.compileTime.} =
a.add(b)
result = a
proc und*(a: NimNode; b: varargs[NimNode]): NimNode {.compileTime.} =
a.add(b)
result = a
proc `^`*(a: string): NimNode {.compileTime.} =
## new ident node
result = newIdentNode(a)
proc `[]`*(a, b: NimNode): NimNode {.compileTime.} =
## new bracket expression: node[node] not to be confused with node[indx]
result = newNimNode(nnkBracketExpr).und(a, b)
proc `:=`*(left, right: NimNode): NimNode {.compileTime.} =
## new Asgn node: left = right
result = newNimNode(nnkAsgn).und(left, right)
proc lit*(a: string): NimNode {.compileTime.} =
result = newStrLitNode(a)
proc lit*(a: int): NimNode {.compileTime.} =
result = newIntLitNode(a)
proc lit*(a: float): NimNode {.compileTime.} =
result = newFloatLitNode(a)
proc lit*(a: char): NimNode {.compileTime.} =
result = newNimNode(nnkCharLit)
result.intval = a.ord
proc emptyNode*(): NimNode {.compileTime.} =
result = newNimNode(nnkEmpty)
proc dot*(left, right: NimNode): NimNode {.compileTime.} =
result = newNimNode(nnkDotExpr).und(left, right)
proc prefix*(a: string, b: NimNode): NimNode {.compileTime.} =
result = newNimNode(nnkPrefix).und(newIdentNode(a), b)
proc quoted2ident*(a: NimNode): NimNode {.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: untyped): untyped =
## Character literal ?A #=> 'A'
result = ($a[1].ident)[0].lit
## echo(?F,?a,?t,?t,?y)
when false:
macro foo(x: untyped) =
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
|