when you cross macro boundary, not only typedesc transformed into NimNode, 
practically all args passed to macros will be transformed into NimNode, no 
matter it is an int, string, int literal, string literal, or a block of 
code/statements, all will be transformed into NimNode with specific kind.
    
    
    macro mymacro(x: int): untyped =
      echo x # perhaps failed to compile, x is not an int anymore, it is a 
NimNode of int literal
    

the same is also happened with T: typedesc, inside a macro, T is not a typedesc 
anymore, it is a NimNode of symbol. When you call template create(x: int, T: 
typedesc): untyped = T(age: x), it will not works because the template create 
expecting a T and constrained the type to typedesc not NimNode. while template 
create(x: int, T: untyped): untyped = T(age: x) will accept T wihout any 
specific type.

when you have more than one macro with the same name, and they don't have 
varargs or untyped parameters, they can participate in macro overloading
    
    
    macro mymacro(T: typedesc): untyped
    macro mymacro(T: int): untyped
    macro mymacro(T: string): untyped
    etc
    

Reply via email to