Well it's time we talk about what v1 should be about. In my opinion v1 should 
be today's Nim with features that don't work well put behind the 
`{.experimental.}` switch or removed altogether. Oh and of course we should 
remove the already deprecated stuff. But the goal should be to keep much of the 
existing Nimble packages working, so removing features like `method` or 
exceptions would do more harm than good. We have a track record of good 
backwards compatibility (though it's far from excellent) and I do not want to 
give that up lightly just because "ha, ha, we were not v1". Nim suffers from an 
overly long development process and I can see room for improvements for nearly 
every aspect in it. But this hunt for perfection should start after v1. In 
fact, I have a hard time finding programming languages in wide use today that 
is not long past v1: Lua is at version 5, Python at 3, Swift at 4 (!?), C# at 
6, Java at 8, D at 2 etc etc. Nobody is able to release the perfect v1, not 
even Rust. 

We need a compromise between stability and room for language experiments.

Let's consider `not nil` as an example: There is no doubt It does not work 
well. What should we do?

**V1**: Put it behind `{.experimental: "notnil".}`  
**V2**: Make it work well. -- OR -- ignore the annotation altogether and 
enforce explicit initializations instead. Then `nil` can only creep into your 
program when you write it. Could turn out to be the best compromise as I push 
for "pointer free" solutions otherwise anyway.  


`method`: It does not work well.

**V1** : Put it behind `{.experimental: "method".}`.  
 **V2** : Map it to some superior `interface` solution, turn it from multi 
methods into single methods. Every usage I've seen in the wild did not rely on 
the "multi" aspect of it anyway.  


Exceptions: A harder problem.  Solution: Ensure critical stdlib operations are 
behind a `.raises: []`. Move more of the offending stdlib into Nimble packages.

`.closure iterator` are weird beasts.

**V1** : Put it behind `{.experimental: "closureiterator".}`  
 **V2** : Put it behind `{.experimental: "resumableproc".}`   


`.discardable`: Let's just deprecate it.

`TaintedString`: They are useful and a tiny amount of complexity. Let's keep 
them.

Other candidates for `.experimental`: `concept`, `void`, `self`. But let me 
clear that `experimental` means more "we're not yet happy with how this feature 
works" rather than "we will remove it again". 

Reply via email to