On 11/21/10 6:12 PM, Rainer Deyke wrote:
On 11/21/2010 11:23, Andrei Alexandrescu wrote:
On 11/20/10 9:42 PM, Rainer Deyke wrote:
On 11/20/2010 16:58, Andrei Alexandrescu wrote:
The parallel does not stand scrutiny. The problem with
vector<bool> in C++ is that it implements no formal
abstraction, although it is a specialization of one.
The problem with std::vector<bool> is that it pretends to be a
std::vector, but isn't. If it was called dynamic_bitset instead,
nobody would have complained. char[] has exactly the same
problem.
char[] does not exhibit the same issues that vector<bool> has.
The situation is very different, and again, trying to reduce one to
another misses a lot of the picture.
I agree that there are differences. For one thing, if you iterate
over a std::vector<bool> you get actual booleans, albeit through an
extra layer of indirection. If you iterate over char[] you might get
chars or you might get dchars depending on the method you use for
iterating.
This is sensible because a string may be seen as a sequence of code
points or a sequence of code units. Either view is useful.
char[] isn't the equivalent of std::vector<bool>. It's worse.
char[] is the equivalent of a vector<bool> that keeps the current
behavior of std::vector<bool> when iterating through iterators, but
gives access to bytes of packed booleans when using operator[].
I explained why char[] is better than vector<bool>. Ignoring the
explanation and restating a fallacious conclusion based on an
overstretched parallel does hardly much to push forward the discussion.
Again: code units _are_ well-defined, useful to have access to, and good
for a variety of uses. Please understand this.
vector<bool> hides representation and in doing so becomes
non-compliant with vector<T> which does expose representation.
Worse, vector<bool> is not compliant with any concept, express or
implied, which makes vector<bool> virtually unusable with generic
code.
The ways in which std::vector<bool> differs from any other vector
are well understood. It uses proxies instead of true references.
Its iterators meet the requirements of input/output iterators (or in
boost terms, readable, writable iterators with random access
traversal). Any generic code written with these limitations in mind
can use std::vector<T> freely. (The C++ standard library doesn't
play nicely with std::vector<bool>, but that's another issue
entirely.)
std::vector<bool> is a useful type, it just isn't a std::vector.
In that respect, its situation is analogous to that of char[].
It may be wise in fact to start using D2 and make criticism
grounded in reality that could help us improve the state of
affairs.
Sorry, but no. It would take a huge investment of time and
effort on my part to switch from C++ to D. I'm not going to make
that leap without looking first, and I'm not going to make it
when I can see that I'm about to jump into a spike pit.
You may rest assured that if anything, strings are not a problem.
I'm not concerned about strings, I'm concerned about *arrays*.
Arrays of T, where T may or not be a character type. I see that you
ignored my Vector!char example yet again.
I sure have replied to it, but probably my reply hasn't been read.
Please allow me to paste it again:
When you define your abstractions, you are free to decide how you
want to go about them. The D programming language makes it
unequivocally clear that char[] is an array of UTF-8 code units that
offers a bidirectional range of code points. Same about wchar[]
(replace UTF-8 with UTF-16). dchar[] is an array of UTF-32 code
points which are equivalent to code units, and as such is a full
random-access range.
So it's up to you what Vector!char does. In D char[] is an array of code
units that can be iterated as a bidirectional range of code points. I
don't see anything cagey about that.
Your assurances aren't increasing my confidence in D, they're
decreasing my confidence in your judgment (and by extension my
confidence in D).
I prefaced my assurances with logical arguments that I can only assume
went unread. You are of course free to your opinion (though it would be
great if it were more grounded in real reasons); the rest of us will
continue enjoying D2 strings.
Andrei