Treating the abusive unsigned syndrome
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Wed Nov 26 13:57:55 PST 2008
Sergey Gromov wrote:
> Wed, 26 Nov 2008 09:12:12 -0600, Andrei Alexandrescu wrote:
>
>> Don wrote:
>>> My suspicion is, that if you allowed all signed-unsigned operations when
>>> at least one was a literal, and made everything else illegal, you'd fix
>>> most of the problems. In particular, there'd be a big reduction in
>>> people abusing 'uint' as a primitive range-limited int.
>> Well, part of my attempt is to transform that abuse into legit use. In
>> other words, I do want to allow people to consider uint a reasonable
>> model of natural numbers. It can't be perfect, but I believe we can make
>> it reasonable.
>>
>> Notice that the fact that one operand is a literal does not solve all of
>> the problems I mentioned. There is for example no progress in typing u1
>> - u2 appropriately.
>>
>>> Although it would be nice to have a type which was range-limited, 'uint'
>>> doesn't do it. Instead, it guarantees the number is between 0 and
>>> int.max*2+1 inclusive. Allowing mixed operations encourages programmers
>>> to focus the benefit of 'the lower bound is zero!' while forgetting that
>>> there is an enormous downside ('I'm saying that this could be larger
>>> than int.max!')
>> I'm not sure I understand this part. To me, the larger problem is
>> underflow, e.g. when subtracting two small uints results in a large uint.
>
> I'm totally with Don here. In math, natural numbers are a subset if
> integers. But uint is not a subset of int. If it were, most of the
> problems would vanish. So it's probably feasible to ban uint from
> SafeD, implement natural numbers by some other means, and leave uint for
> low-level wizardry.
That's also a possibility - consider unsigned types just "bags of bits"
and disallow most arithmetic for them. They could actually be eliminated
entirely from the core language because they can be implemented as a
library. I'm not sure how that would feel like.
I guess length would return an int in that case?
Andrei
More information about the Digitalmars-d
mailing list