blob: 66b6d42c569e68cea00cb34ffbd4e9e22856ae94 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
discard """
errormsg: "'blk.p(a)' has nil child at index 1"
action: reject
"""
import macros
type BlockLiteral[T] = object
p: T
proc p[T](a:int) = echo 1
proc p[T](a:string) = echo "a"
iterator arguments(formalParams: NimNode): NimNode =
var iParam = 0
for i in 1 ..< formalParams.len:
let pp = formalParams[i]
for j in 0 .. pp.len - 3:
yield pp[j]
inc iParam
macro implementInvoke(T: typedesc): untyped =
let t = getTypeImpl(T)[1]
let call = newCall(newDotExpr(ident"blk", ident"p"))
let params = copyNimTree(t[0])
result = newProc(ident"invoke", body = call)
# result[2] = newTree(nnkGenericParams,T)
for n in arguments(params):
call.add(n)
params.insert(1, newIdentDefs(ident"blk", newTree(nnkBracketExpr, bindSym"BlockLiteral", T)))
result.params = params
proc getInvoke(T: typedesc) =
implementInvoke(T)
getInvoke(proc(a: int))
|