If you're only ever directly naming the function names in `passFun`, this works: import std/macros proc square[T](data: T): T = return data*data proc cube[T](data: T): T = return data*data*data proc halve[T](data: T): T = return data / 2 macro passFun(fun, data: untyped): untyped = assert fun.repr in ["square", "cube"] result = quote do: `fun`(`data`) echo "pass the square function: ", passFun(square, 2.0) echo "pass the cube function: ", passFun(cube, 2.0) #echo "pass the error function: ", passFun(halve, 2.0) Run