Generics have the same priority on overload meaning:
proc foo[T](n: T) = discard
proc foo[T: int](n: T) = discard
Run
will both lead ambiguous calls even if you pass an int because they are generic.
The following will not:
proc foo[T](n: T) = discard
proc foo[T](n: int) = discard
Run
Regarding conflicts, you have 2 solutions:
* version control, hopefully will be improved when nimble supports lockfiles
so we can have granularity at the commit level
* module namespacing. Instead of calling with foo, call with
mymodule.foo(arg1, arg2)
I don't buy the argument of serious programming language, both C and Go are
serious languages without generics at all.