Michel Fortin wrote:
On 2008-11-25 16:39:05 -0500, Andrei Alexandrescu <[EMAIL PROTECTED]> said:

Russell Lewis wrote:
I'm of the opinion that we should make mixed-sign operations a compile-time error. I know that it would be annoying in some situations, but IMHO it gives you clearer, more reliable code.

The problem is, it's much more annoying than one might imagine. Even array.length - 1 is up for scrutiny. Technically, even array.length + 1 is a problem because 1 is really a signed int. We could provide exceptions for constants, but exceptions are generally not solving the core issue.

Then the problem is that integer literals are of a specific type. Just make them polysemous and the problem is solved.

Well that at best takes care of _some_ operations involving constants, but for example does not quite take care of array.length - 1.

I am now sorry I gave the silly example of array.length + 1. Many people latched on it and thought that solving that solves the whole problem. That's not quite the case.

Also consider:

auto delta = a1.length - a2.length;

What should the type of delta be? Well, it depends. In my scheme that wouldn't even compile, which I think is a good thing; you must decide whether prior information makes it an unsigned or a signed integral.

I'm with Russel on this one. To me, a litteral value (123, -8, 0) is not an int, not even a constant: it's just a number which doesn't imply any type at all until you place it into a variable (or a constant, or an enum, etc.).
>
And if you're afraid the word polysemous will scare people, don't say the word and call it a "integer litteral". Polysemy in this case is just a mechanism used by the compiler to make the value work as expected with all integral types. All you really need is a type implicitly castable to everything capable of holding the numerical value (much like your __intuint).

I'd make "auto x = 1" create a signed integer variable for the sake of simplicity.

That can be formalized by having polysemous types have a "lemma", a default type.

And all this would also make "uint x = -1" illegal... but then you can easily use "uint x = uint.max" if you want to enable all the bits. It's easier as in C: you don't have to include the right header and remember the name of a constant.

Fine. With constants there is some mileage that can be squeezed. But let's keep in mind that that doesn't solve the larger issue.


Andrei

Reply via email to