On Wednesday, 19 November 2014 at 16:02:50 UTC, David Gileadi wrote:
On 11/19/14, 6:57 AM, ketmar via Digitalmars-d wrote:
On Wed, 19 Nov 2014 13:47:50 +0000
Don via Digitalmars-d <[email protected]> wrote:
If I have two pencils of length 10 cm and 15 cm, then the first
one is -5 cm longer than the other.
and again "length" is not a relation. show me pencil of length -10 cm. when you substractin lengthes, you got completely different type as a result, not "length" anymore. ah, that untyped real-life math! ;-)

To me the salient point is that this is not just a mess with real-life math but also with math in D: lengths are unsigned but people subtract them all the time. If they're (un)lucky this will return correct values for a while, but then someday the lengths may be reversed and the values will be hugely wrong:

    int[] a = [1, 2, 3];
    int[] b = [5, 4, 3, 2, 1];

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

This is why I agree with Don that:

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

I'd say length being unsigned is fine. The real mistake is that the difference between two unsigned values isn't signed, which would be the most "correct" behaviour. Let people cast the result if they want wrapping (or better, use a helper function to document the intentiion).

Reply via email to