For example,
type X = object
i: int
proc f[T](x: T): string =
echo $x
proc `$`(x: X): string =
$(x.i)
f(X())
prints 0.
type X = object
i: int
proc f(x: X): string =
echo $x
proc `$`(x: X): string =
$(x.i)
f(X())
prints (i:0).
But I'm not sure if a generic proc will bind every symbol late.
No, only overloaded symbols are defaulted to open(mixin), non overloaded are bound to the symbol. This can be seen with a simple macro:
import std/macros
proc printSymChoice(impl: NimNode) =
for n in impl:
case n.kind
of nnkOpenSymChoice:
hint("Opened: " & $n[0], n)
of nnkClosedSymChoice:
hint("Closed: " & $n[0], n)
else:
printSymChoice(n)
macro printSymChoices(t: typed): untyped =
printSymChoice(t.getImpl())
proc myProc(i: auto) = discard
proc doThing[T](a: T) =
myProc(a)
printSymChoices(doThing)
proc doX(a: int) = discard
proc doX(a: float) = discard
proc myProc(f: float) = discard
proc doOtherThing[T](a: T) =
bind doX
myProc(a)
doX(a)
printSymChoices(doOtherThing)