For 1: Yes, the compiler can choose to not type check argument expressions when
looking up a template or macro in select situations like `foo(a, b)`; it
doesn't work the same if you do `a.foo(b)`, then `a` has to be typechecked. The
point of having typed templates/macros is making it easier to overload/clearer
to understand.
2: Your problem here is the argument order. `foo(a): b` is equivalent to
`foo(a, b)`, and the following doesn't work:
proc foo(a = 3, b: int) = echo a + b
foo(4) # type mismatch
Run
I'm sure there's some implementation excuse for this to not be allowed but I
don't know what it is. You just have to deal with it.
3: This seems to be an oversight, all static[string]s behave like this. I think
this makes sense, since you can use string literals in backticks and they work
normally.