There’s no conflict when declaring an argument, but when calling a. method there’s a difference. That’s why I wanted the syntax to be the same in the definition side to avoid confusion.
The first one is calling call with foo as a named argument with the value Int32 (a class type).
The second one is calling call with a single argument being a type declaration foo : Int32, which is usually (only) used in macros. One such example is property:
property foo : Int32
That’s the difference. And because foo : Int32 means “foo with a type Int32” but foo: Int32 means "an argument foo with a value of Int32` and in method declarations you want to specify a type, not a value, the former syntax is used in method declarations.
If you have proposals to improve this situation I’m all open to them!
Crystal generics are much more generalized and can be used for many other purposes besides arrays. It’s good to not have a different syntax for a single use case.