mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 18:02:05 +00:00
59 lines
1.5 KiB
Nim
59 lines
1.5 KiB
Nim
import macros,json
|
|
|
|
var decls{.compileTime.}: seq[PNimrodNode] = @[]
|
|
var impls{.compileTime.}: seq[PNimrodNode] = @[]
|
|
|
|
macro importImpl_forward(name, returns): stmt {.immediate.} =
|
|
result = newNimNode(nnkEmpty)
|
|
var func_name = newNimNode(nnkAccQuoted)
|
|
func_name.add newIdentNode("import")
|
|
func_name.add name
|
|
|
|
var res = newNimNode(nnkProcDef)
|
|
res.add newNimNode(nnkPostfix)
|
|
res[0].add newIdentNode("*")
|
|
res[0].add func_name
|
|
res.add newNimNode(nnkEmpty)
|
|
res.add newNimNode(nnkEmpty)
|
|
res.add newNimNode(nnkFormalParams)
|
|
res[3].add returns
|
|
var p1 = newNimNode(nnkIdentDefs)
|
|
p1.add newIdentNode("dat")
|
|
p1.add newIdentNOde("PJsonNode")
|
|
p1.add newNimNode(nnkEmpty)
|
|
res[3].add p1
|
|
var p2 = newNimNode(nnkIdentDefs)
|
|
p2.add newIdentNode("errors")
|
|
p2.add newNimNode(nnkVarTy)
|
|
p2.add newNimNode(nnkEmpty)
|
|
p2[1].add newNimNOde(nnkBracketExpr)
|
|
p2[1][0].add newIdentNode("seq")
|
|
p2[1][0].add newIdentNode("string")
|
|
res[3].add p2
|
|
|
|
res.add newNimNode(nnkEmpty)
|
|
res.add newNimNode(nnkEmpty)
|
|
res.add newNimNode(nnkEmpty)
|
|
|
|
decls.add res
|
|
echo(repr(res))
|
|
|
|
macro importImpl(name, returns: expr, body: stmt): stmt {.immediate.} =
|
|
#var res = getAST(importImpl_forward(name, returns))
|
|
discard getAST(importImpl_forward(name, returns))
|
|
var res = copyNimTree(decls[decls.high])
|
|
res[6] = body
|
|
echo repr(res)
|
|
impls.add res
|
|
|
|
macro okayy:stmt =
|
|
result = newNimNode(nnkStmtList)
|
|
for node in decls: result.add node
|
|
for node in impls: result.add node
|
|
|
|
importimpl(Item, int):
|
|
echo 42
|
|
importImpl(Foo, int16):
|
|
echo 77
|
|
|
|
okayy |