Is -1 > 7 ?

Andre Artus andre.artus at gmail.com
Wed Aug 14 12:41:04 PDT 2013


On Wednesday, 14 August 2013 at 18:08:56 UTC, Ary Borenszweig 
wrote:
> On 8/14/13 2:26 PM, Andre Artus wrote:
>> On Sunday, 11 August 2013 at 17:01:46 UTC, Yota wrote:
>>> On Friday, 9 August 2013 at 17:35:18 UTC, monarch_dodra wrote:
>>>> On Friday, 9 August 2013 at 15:28:10 UTC, Manfred Nowak 
>>>> wrote:
>>>>> michaelc37 wrote:
>>>>>> WTF -> -1 is greater than 7 ????
>>>>>
>>>>> From the docs:
>>>>>
>>>>> It is an error to have one operand be signed and the other 
>>>>> unsigned
>>>>> for a
>>>>> <, <=, > or >= expression.
>>>>>
>>>>> -manfred
>>>>
>>>> Interesting. I didn't know it was documented as being an 
>>>> outright
>>>> error, I thought it was just "surprising"...
>>>>
>>>> I don't think Walter will ever accept to make it illegal 
>>>> though,
>>>> breaks too much code. If this was a change he was OK with, I 
>>>> think we
>>>> would have had it since day one, or at least, years ago.
>>>
>>> I remember hearing somewhere that D is about enforcing users 
>>> to write
>>> CORRECT code.  I would really be disappointed with the 
>>> language if
>>> this sort of gotcha weren't eliminated.
>>>
>>> If I look at this assert, I shouldn't be expecting it to pass.
>>> static assert(-1 > cast(size_t)7);
>>>
>>> IMHO, as long as this sort of comparison causes a 
>>> compile-time error,
>>> as the docs say they should, this kind of breaking change is 
>>> the of
>>> very good sort.  The sort that reveals bugs in code. (Like 
>>> when they
>>> changed the NULL macro to mean 'nullptr' instead of 0 in 
>>> C++.) I
>>> couldn't imagine a programmer exploiting this intentionally, 
>>> as it
>>> serves no purpose.
>>
>> I agree, breaking changes that expose bugs in your code are 
>> the good
>> kind. The time spent fixing compile time errors is more than 
>> compensated
>> for by the time saved not having to hunt down those bugs.
>>
>> Having worked with languages where reference types are 
>> non-nullable by
>> default I wish more languages did the same.
>
> Which are those languages? I'm interested.

Haskell, there are functions called "null", but they are 
[normally] equivalent to "isEmpty". Tri-values and other cases 
for null covered by "Maybe"/"Either".

F#, has null to interface with other .NET languages, but only 
used on the boundaries. Most other cases for null covered with 
"option".

Spec#, when compiling with the "/nn" switch. It's a research 
clone of C# with Eiffel-like features (i.e. contracts). You can 
cast from a nullable type to a not-null type in which case the 
compiler inserts a run-time check. There is also a strict type 
annotation "!" forcing not-null semantics even when compiling 
without "/nn". Unfortunately it's not being actively maintained 
(AFAIK) and has fallen behind on the latest C# features. 
http://specsharp.codeplex.com/

I have not used Eiffel, something about the syntax does not 
appeal to me [1], but I believe it has the concept of "void 
safety" which you can read about here:
http://docs.eiffel.com/book/papers/void-safety-how-eiffel-removes-null-pointer-dereferencing


1. I'm not knocking Eiffel, it has pioneered or promoted many 
important innovations in OOP. My view on the syntax is like my 
taste in ice-cream: merely a personal opinion.


More information about the Digitalmars-d-learn mailing list