On Wed, Dec 12, 2012 at 01:26:08AM +0100, foobar wrote:
> On Wednesday, 12 December 2012 at 00:06:53 UTC, bearophile wrote:
> >foobar:
> >
> >>I would enforce overflow and underflow checking semantics.<
> >
> >Plus one or two switches to disable such checking, if/when someone
> >wants it, to regain the C performance. (Plus some syntax way to
> >disable/enable such checking in a small piece of code).
> >
> >Maybe someday Walter will change his mind about this topic :-)

I don't agree that compiler switches should change language semantics.
Just because you specify a certain compiler switch, it can cause
unrelated breakage in some obscure library somewhere, that assumes
modular arithmetic with C/C++ semantics. And this breakage will in all
likelihood go *unnoticed* until your software is running on the
customer's site and then it crashes horribly. And good luck debugging
that, because the breakage can be very subtle, plus it's *not* in your
own code, but in some obscure library code that you're not familiar
with.

I think a much better approach is to introduce a new type (or new types)
that *does* have the requisite bounds checking and static analysis.
That's what a type system is for.


[...]
> Yeah, of course, that's why I said the C# semantics are _way_
> better. (That's a self quote)
> 
> btw, here's the link for SML which does not use tagged ints -
> http://www.standardml.org/Basis/word.html#Word8:STR:SPEC
> 
> "Instances of the signature WORD provide a type of unsigned integer
> with modular arithmetic and logical operations and conversion
> operations. They are also meant to give efficient access to the
> primitive machine word types of the underlying hardware, and support
> bit-level operations on integers. They are not meant to be a
> ``larger'' int. "

It's kinda too late for D to rename int to word, say, but it's not too
late to introduce a new checked int type, say 'number' or something like
that (you can probably think of a better name).

In fact, Andrei describes a CheckedInt type that uses operator
overloading, etc., to implement an in-library solution to bounds checks.
You can probably expand that into a workable lightweight int
replacement. By wrapping an int in a struct with custom operators, you
can pretty much have an int-sized type (with value semantics, just like
"native" ints, no less!) that does what you want, instead of the usual
C/C++ int semantics.


T

-- 
In a world without fences, who needs Windows and Gates? -- Christian Surchi

Reply via email to