Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
63 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,59 @@ | |||
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 |