On 11/19/14, 9:12 AM, bearophile wrote:
David Gileadi:

    writefln("%s", b.length - a.length);  // Yup, 2
    writefln("%s", a.length - b.length);  // WAT? 18446744073709551614

Nowadays a better way to write such kind of code is using the Phobos
"signed" function:

writefln("%s", b.length.signed - a.length.signed);
writefln("%s", a.length.signed - b.length.signed);

But this requires the following knowledge:
1. That the signed function exists, and its location. As a casual D programmer I didn't know about it. 2. That there's a need for it at all, which requires knowing that length is unsigned. I did know this, but I bet in the heat of programming I'd easily forget it. In a semi-complex algorithm the bug could easily hide for a long time before biting.

This is why I agree with Don that:

> Having arr.length return an unsigned type, is a dreadful
language mistake.

This mistake is by design. Walter has resisted several times turning
them into signed values, and even making size_t a type strongly
different from uint/ulong. I don't agree with this design decision, but
it's unlikely that Walter has changed his mind on it. So better to go on
and discuss other things more likely to happen.

Yes, I bet you're right about the likelihood of change.

Reply via email to