Late bindings example for an interface:
# File ex_macro.nim
import macros
type MyBinaryFunc* = enum
Add
Mul
Equal
# Here "myAdd", "myMul" and "myEqual" are not visible in this scope
# so we need late bindings
let Mapping* {.compileTime.} = [
Add: ident"myAdd",
Mul: ident"myMul",
Equal: ident"myEqual"
]
Run
import ./ex_macro
import macros
proc myAdd(a, b: int): int =
a + b
proc myMul(a, b: int): int =
a * b
proc myEqual(a, b: int): bool =
a == b
macro dispatch(kind: static MyBinaryFunc, a, b: int): untyped =
result = newCall(Mapping[kind], a, b)
echo dispatch(Add, 2, 3)
echo dispatch(Mul, 2, 3)
echo dispatch(Equal, 2, 3)
Run