I maintain that the primary purpose of a programming language is to help people communicate amongst themselves, the implementation of a computer-based solution or algorithm. They exist to help people not machines. If a given syntax fails to do that, then it is not a good programming language.
From appearances, Lisp and C++ both fall short of being a good way help people read and understand a specific problem's implementation - regardless of how robust and accurate that implementation is.
So where is the word simplicity in all of this? Anybody that has learned to use C++ really well has, to my mind, earned the equivalent of a Master's degree. This makes C++ a brilliant failure. So to learn D will we require the equivalent of a PhD? No. Definitely not. Compared to C++, Java, and C#, the D programming language syntax is clean and simple. Sure there are exceptions (the 'static' keyword is way too overloaded) but there aren't many of them.
I'm guessing you haven't actually tried to use D on any non-simple problem yet. But if you have and still claim it lacks simplicity, I'd be very interested in knowing your exact and specific findings.
Good designers make things both simpler and more powerful. They improve the product as much through subtraction as addition. Instead we get this...
and Walter has continued to add more and more features.
Bloody hell. I'm sure you know that many things that are simple to use are also complex under-the-hood. In order to make D simple to use, some very complex concepts have been implemented.
Also, reducing syntax is not the same as increasing the simple-to-use factor. If you take a look at the Forth programming language, its syntax and keyword usage is extremely simple. And yet it is often called a write-only language.
So the only way to represent the concept of a class with an ordering but no equality is to have a run-time failure every time someone tries to compare them for equality? That is correct. There is no mechanism yet to inform the compiler that a specific class must not implement a specific method (in this case an operator override). This would be a useful addition to help coders more accurately express correct behaviour, and whose infractions would be detected at the eariest time, i.e. compile time. But does the lack of this functionality condemn the D language?
So any members whose values are set in the constructor will always be modified twice during construction? This is the 'default' behaviour. The coder can specify that they do not want automatic data initialization for any class members. Often the default initialization value is the very one that the constructor would set anyway.
However, if you are wondering how a constructor down the 'chain' can detect if a data member has already been initialized or not, then this issue is not restricted to D. How would such a sub-constructor know that, regardless of the language used, if there wasn't a concept of an 'uninitialized' value which is automatically set at run-time?
With D, by allowing automatic data initialization, it is in fact possible for sub-constructors to detect 'uninitialized' values.
Programming languages are tools for carbon units to compile instructions for the silicon unit, a lack of being able to master what is going on at the silicon level is a limitation of the carbon unit, thus less effective. D isn't going to solve that at all. I have a slightly different take on that. I think that programming languages are tools for people to express to other people what they want a computer to do. A compiler is the tool to compile programs for the computer. And from my actual use of D in serious applications, it would seem that expressing algorithms to other people is more productive in the D programming language than in many other programming languages I've used.
I maintain that the primary purpose of a programming language is to help people communicate amongst themselves, the implementation of a computer-based solution or algorithm. They exist to help people not machines. If a given syntax fails to do that, then it is not a good programming language.
From appearances, Lisp and C++ both fall short of being a good way help people read and understand a specific problem's implementation - regardless of how robust and accurate that implementation is.