1
- import macros, strutils, sequtils, tables
2
-
3
- const debugMacro = false
1
+ import macros, sequtils
4
2
5
3
proc build (b: NimNode ): NimNode
6
4
@@ -17,24 +15,21 @@ proc buildInline(args: NimNode): seq[NimNode] =
17
15
isArg = true
18
16
19
17
proc labelOf (b: NimNode ): string =
20
- assert b.kind in {nnkIdent, nnkAccQuoted}
18
+ expectKind b, {nnkIdent, nnkAccQuoted}
21
19
if b.kind == nnkAccQuoted:
22
20
result = labelOf (b[0 ])
23
21
else :
24
- result = $ b.ident
22
+ result = $ b
25
23
26
24
proc buildIdent (b: NimNode ): NimNode =
27
25
result = nnkCall.newTree (
28
- newIdentNode (! " newIdentNode" ),
29
- nnkPrefix.newTree (
30
- newIdentNode (! " !" ),
31
- b))
26
+ newIdentNode (" newIdentNode" ), b)
32
27
33
28
proc build (b: NimNode ): NimNode =
34
- var resultNode = newIdentNode (! " result" )
35
- var stmtsNode = newIdentNode (! " stmts" )
36
- var lastNode = newIdentNode (! " last" )
37
- var x = newIdentNode (! " x" )
29
+ var resultNode = newIdentNode (" result" )
30
+ var stmtsNode = newIdentNode (" stmts" )
31
+ var lastNode = newIdentNode (" last" )
32
+ var x = newIdentNode (" x" )
38
33
case b.kind:
39
34
of nnkStmtList:
40
35
result = nnkStmtList.newTree ()
@@ -44,8 +39,7 @@ proc build(b: NimNode): NimNode =
44
39
result = b
45
40
of nnkCall:
46
41
var label = labelOf (b[0 ])
47
- case label:
48
- of " ident" :
42
+ if label.eqIdent " ident" :
49
43
result = buildIdent (newLit ($ b[1 ]))
50
44
result = quote:
51
45
`lastNode`.add (`result`)
@@ -55,11 +49,11 @@ proc build(b: NimNode): NimNode =
55
49
args = buildCall (b[1 ])
56
50
else :
57
51
args = buildInline (b)
58
- var callIdent = newIdentNode (! ( " nnk$1 " % capitalizeAscii ( label)) )
52
+ var callIdent = newIdentNode (" nnk" & $ label)
59
53
result = nnkCall.newTree (
60
54
nnkDotExpr.newTree (
61
55
callIdent,
62
- newIdentNode (! " newTree" )))
56
+ newIdentNode (" newTree" )))
63
57
result = quote:
64
58
`x` = `result`
65
59
`lastNode`.add (`x`)
@@ -72,14 +66,14 @@ proc build(b: NimNode): NimNode =
72
66
result .add (b)
73
67
of nnkCharLit.. nnkUInt64Lit, nnkFloatLit.. nnkFloat64Lit, nnkStrLit.. nnkTripleStrLit:
74
68
result = nnkCall.newTree (
75
- newIdentNode (! " newLit" ),
69
+ newIdentNode (" newLit" ),
76
70
b)
77
71
result = quote:
78
72
`lastNode`.add (`result`)
79
73
of nnkIdent:
80
74
if $ b == " true" or $ b == " false" :
81
75
result = nnkCall.newTree (
82
- newIdentNode (! " newLit" ),
76
+ newIdentNode (" newLit" ),
83
77
b)
84
78
else :
85
79
result = b
@@ -103,7 +97,7 @@ proc build(b: NimNode): NimNode =
103
97
build (branch[0 ])))
104
98
of nnkInfix:
105
99
if b[1 ].kind == nnkStrLit:
106
- var newLitNode = newIdentNode (! " newLit" )
100
+ var newLitNode = newIdentNode (" newLit" )
107
101
result = quote:
108
102
`newLitNode` (`b`)
109
103
else :
@@ -122,39 +116,44 @@ proc build(b: NimNode): NimNode =
122
116
else :
123
117
result = quote:
124
118
`lastNode`.add (`b`)
125
- when debugMacro:
126
- echo treerepr (b)
127
- else :
128
- discard
119
+ when defined (debugBreeze):
120
+ echo treeRepr (b)
129
121
130
122
macro buildMacro * (b: untyped ): untyped =
131
- var stmtsNode = newIdentNode (! " stmts" )
132
- var lastNode = newIdentNode (! " last" )
133
- var x = newIdentNode (! " x" )
134
- var resultNode = newIdentNode (! " result" )
123
+ var stmtsNode = newIdentNode (" stmts" )
124
+ var lastNode = newIdentNode (" last" )
125
+ var x = newIdentNode (" x" )
126
+ var resultNode = newIdentNode (" result" )
135
127
var start = quote:
136
128
var `stmtsNode` = nnkStmtList.newTree ()
137
129
var `lastNode` = `stmtsNode`
138
130
var `x`: NimNode
139
131
var finish = quote:
140
132
`resultNode` = `stmtsNode`
141
-
133
+
142
134
start.add (build (b))
143
135
start.add (finish)
144
136
var empty = newEmptyNode ()
145
-
137
+
146
138
result = nnkCall.newTree (
147
139
nnkPar.newTree (
148
140
nnkLambda.newTree (
149
141
empty,
150
142
empty,
151
143
empty,
152
144
nnkFormalParams.newTree (
153
- newIdentNode (! " NimNode" )),
145
+ newIdentNode (" NimNode" )),
154
146
empty,
155
147
empty,
156
148
start)))
157
149
158
- when debugMacro :
159
- echo " build: $1 " % repr (result )
150
+ when defined (debugBreeze) :
151
+ echo " build:\n " , repr (result )
160
152
153
+ when isMainModule :
154
+ macro s (b: untyped ): untyped =
155
+ var e = newIdentNode (" e" )
156
+ result = buildMacro:
157
+ call:
158
+ dotExpr (e, ident (" f" ))
159
+ infix (ident (" +" ), 2 , 3 )
0 commit comments