Ghosting a language feature

Mathias LANG geod24 at gmail.com
Mon Sep 21 09:06:50 UTC 2020


On Monday, 21 September 2020 at 02:43:57 UTC, Walter Bright wrote:
> On 9/20/2020 7:38 PM, Avrina wrote:
>> why not just remove it so no one uses it.
>
> Because legacy code will use it. Removing features has been a 
> constant source of irritation to users, and they're right.

I wish D would stop trying to be this or that, and finally settle 
on its identity.

People that use D don't do it because they want a flawless 
upgrade path and everything to just be the same 10 years from 
now. If you want this, you just stick with one of the big 
languages. This is not just an hypothesis out of thin air, look 
at the community survey: 
https://rawgit.com/wilzbach/state-of-d/master/report.html
Grep for "What is your tolerance for stability vs. breaking 
changes". Provided the question is biased, but still, the answers 
lean heavily in one direction.

But still, people complain. And many core contributors, myself 
included, will heavily weight against breaking change. So why the 
apparent disconnect ?
Once again, the person that managed to put it together best was 
Don Clugston. He mentioned it in his talk @ DConf 2013.

It's exactly 5 minutes, starting from here: 
https://youtu.be/pmwKRYrfEyY?t=1838

Now, the example that Don used, implicit fallthru, was a win for 
Sociomantic. But what if there was no bug ? If there was only a 
handful occurrences, none of them buggy ? Then they would really 
pay a cost for nothing. A small cost, but a cost nonetheless.

I hit a similar case a few years ago, when I deprecated using the 
return of the comma operator. To my surprise, there were quite a 
few users. Even more surprising, after looking at the way this 
feature was used, it **made perfect sense**. In the particular 
situations, reading the code, using the return of a comma 
expression  was... Neat. And here I was, asking those people to 
change their neat code because I thought it was wrong and led to 
issues such as `synchronized(a, b)`.

Well turns out, D has one of the most powerful tool to deal with 
this: "deprecated".
Deprecating something, and giving a decent timeframe, allows to 
move things forward without destroying the ecosystem. It gives 
the weary programmer a way to ignore a few annoying deprecations 
in his/her code when all that programmer's want to do is enjoy 
the new features in the latest release. It gives times for 
everyone, including dependency, to tackle the problem, at the 
minor inconvenience of a little message.

We've been refining deprecated for years. When it started, you 
could only apply it on functions, and no message was allowed. 
Then we added support for string literal. Then one day Vibe.d 
broke because of a stray import to an empty Phobos module, and we 
added support for deprecated module. Then CTFE-able messages. 
Along the way, we made sure that one could access deprecated code 
within a deprecated scope, so a library can keep providing the 
same functionality to users without breaking compatibility. And 
with D's amazing feature set, a library can even use `static if 
(__VERSION__ >= 2094)` to deprecated based on the compiler used.

Did you know that `deprecated` is so amazing that it's the 
feature that Sociomantic **backported to D1** ? That's right, 
this feature is so awesome that Sociomantic decided they needed 
it more than any other D2 features, because of how much it 
simplified internal libraries updates. And it had amazing ROI.

In conclusion, I simply hope we keep on putting more 
consideration into why people come to D, as opposed to why people 
say they won't. And people come to D not for a language that has 
eternal backwards compatibility, because one simply can use C++ 
for this.


More information about the Digitalmars-d mailing list