import macros, std/ math
macro apply* ( f: typed, xs: untyped) : untyped =
echo f.treeRepr
let funcParams = params( getImpl( f) )
var i: int = 0
var args: seq[ NimNode] = @[ ]
result = newCall( f)
for child in funcParams.children :
if child.kind == nnkIdentDefs:
result.add ( quote do : `xs`[ `i`] )
i += 1
proc f( a: int , b: int , c: int ) : int =
a + b + c
proc mypow( a: float , b: float ) : float =
when isMainModule:
echo $apply( f, @[ 20 .int , 5 .int , 10 .int ] )
echo $apply
( pow , @
[ 2 .
float , 32 .
float ] )
aW1wb3J0IG1hY3Jvcywgc3RkL21hdGgKCm1hY3JvIGFwcGx5KihmOiB0eXBlZCwgeHM6IHVudHlwZWQpOiB1bnR5cGVkID0KICBlY2hvIGYudHJlZVJlcHIKICBsZXQgZnVuY1BhcmFtcyA9IHBhcmFtcyhnZXRJbXBsKGYpKQoKICB2YXIgaTogaW50ID0gMAogIHZhciBhcmdzOiBzZXFbTmltTm9kZV0gPSBAW10KCiAgcmVzdWx0ID0gbmV3Q2FsbChmKQoKICBmb3IgY2hpbGQgaW4gZnVuY1BhcmFtcy5jaGlsZHJlbjoKICAgIGlmIGNoaWxkLmtpbmQgPT0gbm5rSWRlbnREZWZzOgogICAgICByZXN1bHQuYWRkKHF1b3RlIGRvOiBgeHNgW2BpYF0pCiAgICAgIGkgKz0gMQoKcHJvYyBmKGE6IGludCwgYjogaW50LCBjOiBpbnQpIDogaW50ID0KICBhICsgYiArIGMKCnByb2MgbXlwb3coYTogZmxvYXQsIGI6IGZsb2F0KTogZmxvYXQgPQogIHBvdyhhLCBiKQoKd2hlbiBpc01haW5Nb2R1bGU6CiAgZWNobyAkYXBwbHkoZiwgQFsyMC5pbnQsIDUuaW50LCAxMC5pbnRdKQogIGVjaG8gJGFwcGx5KHBvdywgQFsyLmZsb2F0LCAzMi5mbG9hdF0p
compilation info
Sym "f"
ClosedSymChoice
Sym "pow"
Sym "pow"
stack trace: (most recent call last)
prog.nim(5) apply
prog.nim(25, 14) template/generic instantiation from here
prog.nim(5, 34) Error: node is not a symbol
stdout