Skip to content

Commit be94444

Browse files
committed
compiles
1 parent 49c5ba8 commit be94444

File tree

1 file changed

+41
-39
lines changed

1 file changed

+41
-39
lines changed

breeze.nim

+41-39
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import macros, strutils, sequtils, tables
2-
3-
const debugMacro = false
1+
import macros, strutils, sequtils
42

53
proc build(b: NimNode): NimNode
64

@@ -16,25 +14,15 @@ proc buildInline(args: NimNode): seq[NimNode] =
1614
else:
1715
isArg = true
1816

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-
2617
proc buildIdent(b: NimNode): NimNode =
2718
result = nnkCall.newTree(
28-
newIdentNode(!"newIdentNode"),
29-
nnkPrefix.newTree(
30-
newIdentNode(!"!"),
31-
b))
19+
newIdentNode("newIdentNode"), b)
3220

3321
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")
3826
case b.kind:
3927
of nnkStmtList:
4028
result = nnkStmtList.newTree()
@@ -43,9 +31,8 @@ proc build(b: NimNode): NimNode =
4331
of nnkVarSection:
4432
result = b
4533
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":
4936
result = buildIdent(newLit($b[1]))
5037
result = quote:
5138
`lastNode`.add(`result`)
@@ -55,11 +42,11 @@ proc build(b: NimNode): NimNode =
5542
args = buildCall(b[1])
5643
else:
5744
args = buildInline(b)
58-
var callIdent = newIdentNode(!("nnk$1" % capitalizeAscii(label)))
45+
var callIdent = newIdentNode("nnk" & $label)
5946
result = nnkCall.newTree(
6047
nnkDotExpr.newTree(
6148
callIdent,
62-
newIdentNode(!"newTree")))
49+
newIdentNode("newTree")))
6350
result = quote:
6451
`x` = `result`
6552
`lastNode`.add(`x`)
@@ -72,14 +59,14 @@ proc build(b: NimNode): NimNode =
7259
result.add(b)
7360
of nnkCharLit..nnkUInt64Lit, nnkFloatLit..nnkFloat64Lit, nnkStrLit..nnkTripleStrLit:
7461
result = nnkCall.newTree(
75-
newIdentNode(!"newLit"),
62+
newIdentNode("newLit"),
7663
b)
7764
result = quote:
7865
`lastNode`.add(`result`)
7966
of nnkIdent:
8067
if $b == "true" or $b == "false":
8168
result = nnkCall.newTree(
82-
newIdentNode(!"newLit"),
69+
newIdentNode("newLit"),
8370
b)
8471
else:
8572
result = b
@@ -103,7 +90,7 @@ proc build(b: NimNode): NimNode =
10390
build(branch[0])))
10491
of nnkInfix:
10592
if b[1].kind == nnkStrLit:
106-
var newLitNode = newIdentNode(!"newLit")
93+
var newLitNode = newIdentNode("newLit")
10794
result = quote:
10895
`newLitNode`(`b`)
10996
else:
@@ -122,39 +109,54 @@ proc build(b: NimNode): NimNode =
122109
else:
123110
result = quote:
124111
`lastNode`.add(`b`)
125-
when debugMacro:
126-
echo treerepr(b)
127-
else:
128-
discard
112+
when defined(debugBreeze):
113+
echo treeRepr(b)
129114

130115
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")
135120
var start = quote:
136121
var `stmtsNode` = nnkStmtList.newTree()
137122
var `lastNode` = `stmtsNode`
138123
var `x`: NimNode
139124
var finish = quote:
140125
`resultNode` = `stmtsNode`
141-
126+
142127
start.add(build(b))
143128
start.add(finish)
144129
var empty = newEmptyNode()
145-
130+
146131
result = nnkCall.newTree(
147132
nnkPar.newTree(
148133
nnkLambda.newTree(
149134
empty,
150135
empty,
151136
empty,
152137
nnkFormalParams.newTree(
153-
newIdentNode(!"NimNode")),
138+
newIdentNode("NimNode")),
154139
empty,
155140
empty,
156141
start)))
157142

158-
when debugMacro:
159-
echo "build: $1" % repr(result)
143+
when defined(debugBreeze):
144+
echo "build:\n", repr(result)
160145

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

Comments
 (0)