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))
let hoge: int = 3
mkmacro "fuga"
echo hoge.fuga(4, 1)
aW1wb3J0IG1hY3JvcwogCm1hY3JvIG1rbWFjKGEsIGIsIGM6IHVudHlwZWQpOiB1bnR5cGVkID0KICByZXN1bHQgPSBuZXdTdG10TGlzdCgpCiAgcmVzdWx0LmFkZCBxdW90ZSBkbzoKICAgIGBhYCAqIChgYmAgKyBgY2ApCiAKbWFjcm8gbWttYWNybyhmbjogc3RhdGljW3N0cmluZ10pOiB1bnR5cGVkID0KICByZXN1bHQgPSBuZXdTdG10TGlzdCgpCiAKICB2YXIgYm9keSA9IG5ld1N0bXRMaXN0KCkKICBib2R5LmFkZCgid3JpdGUiLm5ld0NhbGwoInN0ZG91dCIuaWRlbnQsICJURVNUXG4iLm5ld1N0ckxpdE5vZGUpKQogCiAgdmFyIGJyYSA9IG5ua0JyYWNrZXQubmV3VHJlZQogIGJyYS5hZGQoMy5uZXdJbnRMaXROb2RlKQogIGJyYS5hZGQoNy5uZXdJbnRMaXROb2RlKQogIGJyYS5hZGQoMS5uZXdJbnRMaXROb2RlKQogIGxldCBzZXEgPSBicmEucHJlZml4KCJAIikKICBsZXQgc2VxTGl0ID0gQFszLCA3LCAxXS5uZXdMaXQKICBib2R5LmFkZCgiZWNobyIubmV3Q2FsbChubmtJbkZpeC5uZXdUcmVlKCI9PSIuaWRlbnQsIHNlcSwgc2VxTGl0KSkpCiAKICBsZXQgYXN0OiBOaW1Ob2RlID0gZ2V0QXN0IG1rbWFjKCJ4Ii5pZGVudCwgInkiLmlkZW50LCAieiIuaWRlbnQpCiAgYm9keS5hZGQobmV3QXNzaWdubWVudCgicmVzdWx0Ii5pZGVudCwgYXN0KSkKIAogIHJlc3VsdC5hZGQobmV3UHJvYyhmbi5pZGVudC5wb3N0Zml4KCIqIiksCiAgICBbImludCIuaWRlbnQsCiAgICAgIG5ld0lkZW50RGVmcygieCIuaWRlbnQsICJpbnQiLmlkZW50KSwKICAgICAgbmV3SWRlbnREZWZzKCJ5Ii5pZGVudCwgImludCIuaWRlbnQpLAogICAgICBuZXdJZGVudERlZnMoInoiLmlkZW50LCAiaW50Ii5pZGVudCldLAogICAgYm9keSwgbm5rUHJvY0RlZikpCiAKbGV0IGhvZ2U6IGludCA9IDMKbWttYWNybyAiZnVnYSIKZWNobyBob2dlLmZ1Z2EoNCwgMSk=