Hi,
Let me write some comments and suggestions. I added numbers, so you can refer
to them easier. I understand that some of these requests are actually making
the `concept` body a little bit longer. However, I believe that these will make
Nim cleaner.
**1.**
_Suggestion:_ I think that the form `T = type(c[0])` should be used instead of
the form `c[0] is T` when defining `T` inside concepts.
_Reasons_: My main reason is not to let `is` to modify its parameters, and let
`c[0] is T` to be a pure type check with no side effects. (I'm not a big fan of
`T = type(c[0])`, but I don't know a better solution.)
_Implementation_: I think that an extra check should be added to `semAsgn` proc
in _semexpr.nim_ before it calls `localError` with `errXCannotBeAssignedTo` to
enable `T = type(c[0])`.
**2.**
_Suggestion:_ I think that `put(m.bindings, p[1], p[0].typ)` should be replaced
to something more careful and smarter logic at the end of `matchUserTypeClass`.
Is it possible that we override an already matched generic parameter? Is the
this example working now: `proc f[T](x: Container[seq[T]]): T = ...` (where `x`
can be `seq[seq[int]]`)?
_Implementation_: `procParamTypeRel` calls `typeRel`, maybe we should copy that
logic. The order of parameters of `typeRel` matters a lot :)
**3.**
_Suggestion:_ We should use `T` only for types, and not for default values.
This code shouldn't work: `m.contains(K) is bool`.
_Reasons_: It might happen that `m.contains(...)` actually accepts a type (as
well). Also it is not a valid code outside of a concept. I think that we should
have functions to generate immutable instance (e.g., `default(T)`), and mutable
instance (e.g., `defaultVar(T)`), so we won't need to wrtie `var k: K;
m.contains(k) is bool`.
**4.**
I know that this is just an example. However in your `Map[K, V]` example `K` is
not inferred, but why? Is it possible that an object is `Map[float, string]`
and `Map[int, int]` as well? I would add `m.keysSeq()` (which is an important
part of a map in my view), and it defines `K`.
Thanks,
Peter