On Tuesday, 17 May 2016 at 14:06:37 UTC, Jack Stouffer wrote:
Thanks for writing this. Great article.
static assert(is(typeof(s.front()) == dchar));
I believe .front is a property (so some ranges can implement it
as a field, not a @property function). Hence, no parens.
So, why is typeof(s.front) == dchar.
In plain English, this means when iterating over strings in D,
D will look ahead in the string and combine any code units that
make up a single code point.
Perhaps clarify that this only applies to ranges. `foreach` on a
string will iterate over chars, but you can iterate over code
points if you specify the dchar type explicitly.
More confusing text on the same issue lower, and in the intro:
Iterating a char array with C style for loops produces
different results than foreach loops due to auto decoding.
One feature of D that is confusing to a lot of new comers is
the behavior of strings in relation to range based features
like the foreach statement and range algorithms.
E.g. for ë the code units C3 AB (for UTF-8) would turn into a
single code point.
Perhaps choose a character that is not also expressable via
composite characters, to avoid potential for confusion.
string s = "cassé";
Ditto (unless the goal was to complement the example from my .d
These glaring inconsistencies are the cause of a lot of
confusion for new comers.
(Opinion) I would say that they also cause issues in generic code.
Every time one wants a generic algorithm to work with both
strings and ranges, you wind up special casing via static
if-ing narrow strings to defeat the auto decoding, or to decode
the ranges. Case in point.
Link to the exact SHA to prevent the link from getting outdated.
On Github, just hit 'y' on your keyboard to go to the "permalink"
Auto decoding has two choices when encountering invalid code
units: throw, or produce an error dchar like std.utf.byUTF does.
(Aside) This was an interesting discussion on the subject:
However, in my opinion D is too far along to to suddenly ask
Some more info / links on the subject I collected a few years ago: