Oh, right! I guess it's testing it on untyped rather than the actual type in the macro. Anyways, this one is definitely working, it just tests for void-typed arguments: import macros import typetraits import strformat macro fun*(n: varargs[typed]): typed = result = newNimNode(nnkStmtList, n) var echoedCount = 0 for x in n: if x.getTypeInst.typeKind != ntyVoid: result.add(newCall("echo", x)) echoedCount += 1 result.add(newCall("echo", newStrLitNode($(echoedCount)))) proc bar() = echo "ok" fun(1+1) # n.len=1 fun() # n.len=0 # comment this to make it work fun(bar())
> isn't that a better behavior? if not what would be downsides of that? No, I think automatically filtering void arguments in a macro is not a better or intuitive behavior. What if you remove a return type from a function and the compiler just silently starts ignoring it in argument lists instead of producing a type mismatch error? That seems like it could be an interesting source of bugs. I guess what you're asking for is not SFINAE, but it feels similar -- it's a hack used to make template systems have some limited metaprogramming. I think that you'll find that sort of thing is not necessary with Nim, you can just write a macro that does what you want. Is there something specific that you're trying to do that requires the argument-ignoring approach used in D? Maybe we could help you come up with a good solution for it in Nim.