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