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".