Le 25/09/2012 21:24, bearophile a écrit :
deadalnix:
bool b; // Defined elsewhere.
string s = "somestring" ~ b?"":"somemorestring";
bool => char implicit conversion is not commonly useful in programs, but
I think it's also not a common bug.
Thi sis reversed logic. bool => char have know drawback. So it must
bring something at least as important as the drawback (whatever how
small it is) involved.
I also wanted to discuss this subject specifically because it was a
surprise to me and to other people on IRC. So I guess this feature is
counter intuitive and contradict the rule that state that thing should
work the way you expect them to work.
I also already knew that ?: were sometime confusing. However, I skipped
on that because I was sure (and wrong) that a type error would be triggered.
It is a surprising behavior, so something you want to avoid as much as
possible when creating a programing language.
On the other hand in past we have discussed a little about the bug-prone
precedence of the ?: operator. Analysis of shared code repositories
shows that this is a common source of bugs. So I think avoiding this bug
has higher priority (and it's enough to avoid your specific bug).
One of the ideas for D was that when the ?: is included in a larger
expression, to requires parentheses around it.
auto x1 = y1 ? z1 : w1; // OK
auto x2 = x0 + (y1 ? z1 : w1); // OK
auto x3 = (x0 + y1) ? z1 : w1); // OK
auto x4 = x0 + y1 ? z1 : w1; // error
auto x5 = y1 ? z1 : (y2 ? z2 : w2); // OK
auto x6 = y1 ? z1 : y2 ? z2 : w2; // error
In theory this increases the number of parentheses a little, but in
practice in many similar situations I already put those parentheses, for
readability and to avoid some of my mistakes.
Bye,
bearophile
This would solve my particular bug, and I think it is a good thing to
make this clearer.