Really interesting, as your comments usually are. I've started diving into type 
theory and things you, @timothee and others have contributed are part of the 
reason.

A modification proposal: the minimal one-pragma approach is elegant, but let's 
not break import visibility semantics: the meaning of `*` could remain as it is 
and one could pass an optional parameter to `prototype` to denote extensibility:

`{.prototype(open).}`

or

`{.prototype(extensible).}`

These could also be valid inside the defining module.

A general thought: prototypical/exemplary definitions seem to go against most 
peoples' intuition in the context of statically typed languages. It feels 
JavaScript-y. Comparable to the witness construct you proposed during the 
discussion about symbol aliases started by @timothee. Back then I felt that 
supplying "explanatory example code" to the compiler sounded really weird. But 
now I think that that was irrational, especially with meta-programming making 
generating various kinds of types possible, at least in principle.

If it was easier to experiment with types, people could get creative and I 
believe some substantial practical progress could be made. A DSL for type 
calculus and transformation rules which produces the compiler code for type 
verification and resolution and defines new type implementations with Nim's 
existing types as building blocks; is that a pipe dream or a realistic goal? 

Reply via email to