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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
# Dump the contents of a NimNode
import macros
block:
template plus(a, b: untyped): untyped {.dirty} =
a + b
macro call(e: untyped): untyped =
result = newCall("foo", newStrLitNode("bar"))
macro dumpAST(n: untyped): string =
var msg = ""
msg.add "lispRepr:\n" & n.lispRepr & "\n"
msg.add "treeRepr:\n" & n.treeRepr & "\n"
var plusAst = getAst(plus(1, 2))
msg.add "lispRepr:\n" & n.lispRepr & "\n"
var callAst = getAst(call(4))
msg.add "callAst.lispRepr:\n" & callAst.lispRepr & "\n"
var e = parseExpr("foo(bar + baz)")
msg.add "e.lispRepr:\n" & e.lispRepr & "\n"
result = msg.newLit
let a = dumpAST:
proc add(x, y: int): int =
return x + y
const foo = 3
doAssert a == """
lispRepr:
(StmtList (ProcDef (Ident "add") (Empty) (Empty) (FormalParams (Ident "int") (IdentDefs (Ident "x") (Ident "y") (Ident "int") (Empty))) (Empty) (Empty) (StmtList (ReturnStmt (Infix (Ident "+") (Ident "x") (Ident "y"))))) (ConstSection (ConstDef (Ident "foo") (Empty) (IntLit 3))))
treeRepr:
StmtList
ProcDef
Ident "add"
Empty
Empty
FormalParams
Ident "int"
IdentDefs
Ident "x"
Ident "y"
Ident "int"
Empty
Empty
Empty
StmtList
ReturnStmt
Infix
Ident "+"
Ident "x"
Ident "y"
ConstSection
ConstDef
Ident "foo"
Empty
IntLit 3
lispRepr:
(StmtList (ProcDef (Ident "add") (Empty) (Empty) (FormalParams (Ident "int") (IdentDefs (Ident "x") (Ident "y") (Ident "int") (Empty))) (Empty) (Empty) (StmtList (ReturnStmt (Infix (Ident "+") (Ident "x") (Ident "y"))))) (ConstSection (ConstDef (Ident "foo") (Empty) (IntLit 3))))
callAst.lispRepr:
(Call (Ident "foo") (StrLit "bar"))
e.lispRepr:
(Call (Ident "foo") (Infix (Ident "+") (Ident "bar") (Ident "baz")))
"""
macro fun() =
let n = quote do:
1+1 == 2
doAssert n.repr == "1 + 1 == 2", n.repr
fun()
macro fun2(): untyped =
let n = quote do:
1 + 2 * 3 == 1 + 6
doAssert n.repr == "1 + 2 * 3 == 1 + 6", n.repr
fun2()
macro fun3(): untyped =
let n = quote do:
int | float | array | seq | object | ptr | pointer | float32
doAssert n.repr == "int | float | array | seq | object | ptr | pointer | float32", n.repr
fun3()
macro fun4() =
let n = quote do:
(a: 1)
doAssert n.repr == "(a: 1)", n.repr
fun4()
# nkTupleConstr vs nkPar tests:
block: # lispRepr
macro lispRepr2(a: untyped): string = newLit a.lispRepr
doAssert lispRepr2(()) == """(TupleConstr)"""
doAssert lispRepr2((a: 1)) == """(TupleConstr (ExprColonExpr (Ident "a") (IntLit 1)))"""
doAssert lispRepr2((a: 1, b: 2)) == """(TupleConstr (ExprColonExpr (Ident "a") (IntLit 1)) (ExprColonExpr (Ident "b") (IntLit 2)))"""
doAssert lispRepr2((1,)) == """(TupleConstr (IntLit 1))"""
doAssert lispRepr2((1, 2)) == """(TupleConstr (IntLit 1) (IntLit 2))"""
doAssert lispRepr2((1, 2, 3.0)) == """(TupleConstr (IntLit 1) (IntLit 2) (FloatLit 3.0))"""
doAssert lispRepr2((1)) == """(Par (IntLit 1))"""
doAssert lispRepr2((1+2)) == """(Par (Infix (Ident "+") (IntLit 1) (IntLit 2)))"""
block: # repr
macro repr2(a: untyped): string = newLit a.repr
doAssert repr2(()) == "()"
doAssert repr2((a: 1)) == "(a: 1)"
doAssert repr2((a: 1, b: 2)) == "(a: 1, b: 2)"
doAssert repr2((1,)) == "(1,)"
doAssert repr2((1, 2)) == "(1, 2)"
doAssert repr2((1, 2, 3.0)) == "(1, 2, 3.0)"
doAssert repr2((1)) == "(1)"
doAssert repr2((1+2)) == "(1 + 2)"
block: # treeRepr
macro treeRepr2(a: untyped): string = newLit a.treeRepr
macro treeRepr3(a: typed): string = newLit a.treeRepr
doAssert treeRepr2(1+1 == 2) == """
Infix
Ident "=="
Infix
Ident "+"
IntLit 1
IntLit 1
IntLit 2"""
proc baz() = discard
proc baz(a: int) = discard
proc baz(a: float) = discard
doAssert treeRepr3(baz()) == """
Call
Sym "baz""""
let a = treeRepr3(block:
proc bar(a: auto) = baz())
doAssert a == """
BlockStmt
Empty
ProcDef
Sym "bar"
Empty
GenericParams
Sym "a:type"
FormalParams
Empty
IdentDefs
Sym "a"
Sym "auto"
Empty
Empty
Bracket
Empty
Empty
StmtList
Call
OpenSymChoice 3 "baz""""
|