@zahary It becomes more and more obvious that I won't have time to work on Nim nowadays. It is my regular job which put more load on me.
Coming back to `Concept[T]`, I can see 3 possible ways to continue. **1.**: allow inference only if its unique. So `c.push(T)` only works if there is one `push` function, or we already know what `T` type is (e.g., we know that it is `string`). **2.**: allow inference to metatypes. So `c.push(T)` can lead to `T` being `string|int`. I recommend an extra check at the end. That is if you have a match (e.g., `T` is `int` and `S` is `int`), then reevaluate the concept's body again just to be sure. (Just for the record, the reason for this extra check is an example above somewhere in this thread.) **3.**: allow some extremely smart logic which infers everything which is possible. This needs to involve some backtrack logic. I would vote to `1.`, but that doesn't work with your `Stack[T]` case. I'm strongly against with `3.`, because it can lead to extreme compilation time. `2.` looks nice. Peter