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