Here are a few more "basics" that are unneeded or confusing. Lets
not even talk about the more advanced features like inout, ...
* auto: Static typed language yet we fall back on the compiler to
figure out what is being assigned. Can just as well have a
interpreter language. It only encourages lazy writing and has a
penalty on the compilation.
* to!string, to!... requires "import std.conv"
* basic string manipulation requires "import std.string"
* join, replace, replaceInPlace, split, empty all require
... these are basic language features, yet its required to
included each of those libraries to every file you need it. A lot
of languages have basic functions as standard or dynamically
include the required code upon compilation ( or error if you have
a double naming ). The time saved on auto compilation, can be
reused to do the above mentioned. Two birds with one move.
* splitLines vs split .. std.array vs std.string
It confuses people because split is part of std.array but
splitLines is part of std.string. Really! Most languages simply
have split as a basic language feature and you indicate what you
want to split.
Its not the only confusing or double function that is present in
the standard library.
* scope() .. just call it "defer" just as every other language
now does. It only confuses people who come from other languages.
Its now almost a standard. By using scope people have have no
clue that D has a defer. Took even me a while to know that D had
a defer system in place.
If you have a few more weeks, this list is long :)
Unfortunately, because the code base it is impossible to fix
these issues as too much code depends on it. The libraries,