bool (was DConf 2019 AGM Livestream)
Isaac S.
spam-no-reply-isaac at outlook.com
Sun May 12 10:27:42 UTC 2019
On Sunday, 12 May 2019 at 05:43:01 UTC, Walter Bright wrote:
> On 5/11/2019 7:27 PM, Mike Franklin wrote:
> I understand. Every programmer, sooner or later, decides to
> step up and take a swing at inventing boolean. (I have too -
> did you know that D used to have a `bit` builtin type?)
Yes, D did have a bit type that was removed since it required
special casing for something that didn't provide much of a
benefit.
> The programming landscape is littered with the corpses of one
> after another.
You say the programming landscape, yet give very limited
examples. It would help to give examples in languages that did
not have a hindered boolean type. In languages with a
non-hindered boolean (e.g. Java) I've only ever seen custom
booleans for overloading or to flag intent when named arguments
are unsupported.
> Phobos has multiple ones
Well... yes, this is Phobos; Phobos is in need of a cleanup.
> RefCountedAutoInitialize .yes and .no
Something like this is probably a remnant of code made before
std.typecons.Flag. It shouldn't have gotten into Phobos
(regardless of if it was before or after std.typecons.Flag).
> and even a struct Yes and a struct No.
The structs Flag, Yes, and No should not be considered by
themselves as they are all apart of the same concept. The Flag
concept is to force a caller to explicitly state what true/false
mean. This is desired due to the lack of named arguments in D.
> std.bitmanip has an enum A{True,False}. std.json has enum
> E{True=true}.
In unittests they do. The std.bitmanip is most likely
overzealously testing something (1-bit sized enum?). The std.json
one is obviously testing if an enum with an underlying boolean
value is correctly converted.
> std.typecons has the bizarre enum issue10647_isAlwaysTrue=true;.
Yes, that is bizarre. Considering its a enum constant of type
bool, this doesn't pertain to custom boolean types.
> The C++ Committee currently is fiercely debating adding a
> "Boolean" construct in one of the longest threads I've ever
> seen. One of their problems is it conflicts with the endless
> "Boolean" types added to existing C++ code, along with every
> variation "Bool", "Bool", "boolean", etc.
>
> All this effort strongly implies that there's no such thing as
> a satisfactory bool type.
No, this implies C++ had a boolean type that was lacking; which
it *severely* is in type safety.
There are multiple booleans in C++ because programmers are not
going to unite on one *non-standard* boolean type. Even if the
committee added one, it will take years for the damage to be
undone (if ever).
> Will you succeed where 10,000 other programmers have failed?
> Seems unlikely. But I doubt I will dissuade you from trying.
Well other than the overstatement on reinventing the boolean; I
do agree here that success is unlikely, but not for the same
reason. A custom boolean type will be used infrequently (I'm
certainly not depending on a dub package just for a boolean
type), will have to be imported in *every* file it is used in,
and will inevitably fracture whenever someone copies the code to
their codebase.
> So what does work reasonably?
> Treating it like a small integer.
So mixing the concepts of true/false and numerical data is
"reasonable". I'll have to remember that if I ever have a
true/false test; 1's and 0's are quicker to write than T's and
F's.
Jokes aside, I have yet to see how making it a "small integer"
improves this supposed reinventing-the-bool-wheel problem or
makes it anymore useful than a normal boolean. In fact, it seems
more-so like you've made a oval wheel: technically functional but
not really.
> I know the operator ++ difference, and it is my fault that I
> succumbed to a moment of boolean madness and allowed that in.
> (++ on D bool is saturation arithmetic, unlike the overflow
> semantics in every other integer type. It is a mistake, please
> don't use that as justification for adding more quirky
> behaviors.)
I don't have to justify other quirky behavior with ++ being
saturated arithmetic because you said:
> Treating it like a small integer.
If bool is going to be a 1-bit integer with saturated arithmetic
semantics, then it should act like one. +=, -=, *=, ^^=, /=, and
%= should be allowed as it is a "small integer". Sure /= and %=
would largely be a divide-by-zero operation, but at least bool
would be the type unsafe "integer" it is suppose to be.
> We know what the various integer semantics are, and it fits
> right in with that.
I have yet to see where bool fits into integer semantics
reasonably without causing problems and annoyances (as well as
having just generally weird behavior).
> On a final note, C++ added a std::vector<bool> special case,
> which works unlike any other vector type. Years of experience
> have shown that to have been a mistake, just like all the
> others, and it is widely derided as a complete failure.
That isn't a fault of bool by any means, that is the fault of
making an unnecessary special case that sometimes acts different
from every other case.
The real question to look at here is what Nick said:
> Do we have 'bool' because a 1-bit integer is useful, or do we
> have
> 'bool' because a "true vs false" abstraction is useful?
The answer to that, is because a "true vs false" abstraction is
useful. A 1-bit integer provides no real benefit: I could still
use a byte and get pretty much the same behavior (type unsafety
and all!). I could even do like a lot of C/C++ code I've seen and
use int.
This is the crux of the argument: *How* does making bool an
integer add to the language? We have examples of how making bool
*not* an integer adds to the language, mainly in type safety; we
still don't have examples of how making it an integer adds to the
language.
More information about the Digitalmars-d-announce
mailing list