import macros
macro mkmac(a, b, c: untyped): untyped =
result = newStmtList()
result.add quote do:
`a` * (`b` + `c`)
macro mkmacro(fn: static[string]): untyped =
result = newStmtList()
var body = newStmtList()
body.add("write".newCall("stdout".ident, "TEST\n".newStrLitNode))
var bra = nnkBracket.newTree
bra.add(3.newIntLitNode)
bra.add(7.newIntLitNode)
bra.add(1.newIntLitNode)
let seq = bra.prefix("@")
let seqLit = @[3, 7, 1].newLit
body.add("echo".newCall(nnkInFix.newTree("==".ident, seq, seqLit)))
let ast: NimNode = getAst mkmac("x".ident, "y".ident, "z".ident)
body.add(newAssignment("result".ident, ast))
result.add(newProc(fn.ident.postfix("*"),
["int".ident,
newIdentDefs("x".ident, "int".ident),
newIdentDefs("y".ident, "int".ident),
newIdentDefs("z".ident, "int".ident)],
body, nnkProcDef, newEmptyNode()))
let hoge: int = 3
mkmacro "fuga"
echo hoge.fuga(4, 1)
aW1wb3J0IG1hY3JvcwoKbWFjcm8gbWttYWMoYSwgYiwgYzogdW50eXBlZCk6IHVudHlwZWQgPQogIHJlc3VsdCA9IG5ld1N0bXRMaXN0KCkKICByZXN1bHQuYWRkIHF1b3RlIGRvOgogICAgYGFgICogKGBiYCArIGBjYCkKCm1hY3JvIG1rbWFjcm8oZm46IHN0YXRpY1tzdHJpbmddKTogdW50eXBlZCA9CiAgcmVzdWx0ID0gbmV3U3RtdExpc3QoKQoKICB2YXIgYm9keSA9IG5ld1N0bXRMaXN0KCkKICBib2R5LmFkZCgid3JpdGUiLm5ld0NhbGwoInN0ZG91dCIuaWRlbnQsICJURVNUXG4iLm5ld1N0ckxpdE5vZGUpKQoKICB2YXIgYnJhID0gbm5rQnJhY2tldC5uZXdUcmVlCiAgYnJhLmFkZCgzLm5ld0ludExpdE5vZGUpCiAgYnJhLmFkZCg3Lm5ld0ludExpdE5vZGUpCiAgYnJhLmFkZCgxLm5ld0ludExpdE5vZGUpCiAgbGV0IHNlcSA9IGJyYS5wcmVmaXgoIkAiKQogIGxldCBzZXFMaXQgPSBAWzMsIDcsIDFdLm5ld0xpdAogIGJvZHkuYWRkKCJlY2hvIi5uZXdDYWxsKG5ua0luRml4Lm5ld1RyZWUoIj09Ii5pZGVudCwgc2VxLCBzZXFMaXQpKSkKCiAgbGV0IGFzdDogTmltTm9kZSA9IGdldEFzdCBta21hYygieCIuaWRlbnQsICJ5Ii5pZGVudCwgInoiLmlkZW50KQogIGJvZHkuYWRkKG5ld0Fzc2lnbm1lbnQoInJlc3VsdCIuaWRlbnQsIGFzdCkpCgogIHJlc3VsdC5hZGQobmV3UHJvYyhmbi5pZGVudC5wb3N0Zml4KCIqIiksCiAgICBbImludCIuaWRlbnQsCiAgICAgIG5ld0lkZW50RGVmcygieCIuaWRlbnQsICJpbnQiLmlkZW50KSwKICAgICAgbmV3SWRlbnREZWZzKCJ5Ii5pZGVudCwgImludCIuaWRlbnQpLAogICAgICBuZXdJZGVudERlZnMoInoiLmlkZW50LCAiaW50Ii5pZGVudCldLAogICAgYm9keSwgbm5rUHJvY0RlZiwgbmV3RW1wdHlOb2RlKCkpKQoKbGV0IGhvZ2U6IGludCA9IDMKbWttYWNybyAiZnVnYSIKZWNobyBob2dlLmZ1Z2EoNCwgMSkK
prog.nim(25, 21) Error: type mismatch: got <NimNode, array[0..3, NimNode], NimNode, NimNodeKind, NimNode>
but expected one of:
proc newProc(name = newEmptyNode(); params: openArray[NimNode] = [newEmptyNode()];
body: NimNode = newStmtList(); procType = nnkProcDef): NimNode
expression: newProc(postfix(ident(fn), "*"), [ident("int"), newIdentDefs(ident("x"),
ident("int"), newEmptyNode()), newIdentDefs(ident("y"), ident("int"),
newEmptyNode()), newIdentDefs(ident("z"), ident("int"), newEmptyNode())], body,
nnkProcDef, newEmptyNode())