make (a < b < c) illegal?
Andrei Alexandrescu (See Website For Email)
SeeWebsiteForEmail at erdani.org
Wed Feb 7 19:02:06 PST 2007
Derek Parnell wrote:
> On Wed, 07 Feb 2007 17:09:35 -0800, Andrei Alexandrescu (See Website For
> Email) wrote:
>
>> Derek Parnell wrote:
>>> On Wed, 07 Feb 2007 16:55:15 -0800, Walter Bright wrote:
>>>
>>>> Right now, in D (as well as C and C++), when you see the expression:
>>>>
>>>> if (a < b < c)
>>>>
>>>> what is your first thought? Mine is that it was written by a newbie who
>>>> didn't realize that (a < b) returns true or false, and that it does NOT
>>>> mean ((a < b) && (b < c)). The odds approach certainty that this is a
>>>> logic error in the code, and even if it was intentional, it raises such
>>>> a red flag that it shouldn't be used anyway.
>>>>
>>>> Andrei has proposed (and I agreed) that this should be done away with in
>>>> the language, i.e. comparison operators should no longer be associative.
>>>> It's a simple change to the grammar. If one really did want to write
>>>> such code, it could be done with parentheses:
>>>>
>>>> if ((a < b) < c)
>>>>
>>>> to get the original behavior. At least, that looks intentional.
>>>>
>>>> I don't think this will break existing code that isn't already broken.
>>> First thought: Yes, your proposed change makes sense.
>>>
>>> Second thought: Why not make it do what the coder is wanting it to do?
>>> Namely, make the idiom:
>>>
>>> expression1 relopA expression2 relopB expression3
>>>
>>> translate as
>>>
>>> ( auto temp = expression2,
>>> (expression1 relopA temp) && (temp relopB expression3) )
>> What's the intended meaning of:
>>
>> a < b == c < d
>
> Well that *obvious*!
>
> (((a < b) && (b == c)) < d) <G>
>
> Okay, okay, I see your point. But it would be useful (one day) to easily
> code the idiom (a op b) && (b op c), no?
>
> How about someone knocking up a mixin template for expressions of this
> format? I haven't got a clue how it could be done as the
> mixin/template/meta-programming syntax and semantics of D is still so
> obtuse and confusing to me that I can only do the very simplest things and
> then only after many false starts.
It's very easy to implement as a straight template function:
ordered(a, b, c)
returns true iff a <= b <= c, and
strictly_ordered(a, b, c)
returns true iff a < b < c. The functions can be nicely accommodate
multiple arguments. Other functions can define STL-style in-range.
Andrei
More information about the Digitalmars-d
mailing list