WAT: opCmp and opEquals woes

Tobias Pankrath via Digitalmars-d digitalmars-d at puremagic.com
Fri Jul 25 07:46:08 PDT 2014


On Friday, 25 July 2014 at 13:44:54 UTC, H. S. Teoh via 
Digitalmars-d wrote:
> On Fri, Jul 25, 2014 at 12:10:31PM +0100, Regan Heath via 
> Digitalmars-d wrote:
>> On Fri, 25 Jul 2014 09:39:11 +0100, Walter Bright
>> <newshound2 at digitalmars.com> wrote:
>> 
>> >On 7/25/2014 1:02 AM, Jacob Carlborg wrote:
>> >>3. If opCmp is defined but no opEquals, lhs == rhs will be 
>> >>lowered
>> >>to lhs.opCmp(rhs) == 0
>> >
>> >This is the sticking point. opCmp and opEquals are separate on
>> >purpose, see Andrei's posts.
>> 
>> Sure, Andrei makes a valid point .. for a minority of cases.  
>> The
>> majority case will be that opEquals and opCmp==0 will agree.  
>> In those
>> minority cases where they are intended to disagree the user 
>> will have
>> intentionally defined both, to be different.  I cannot think 
>> of any
>> case where a user will intend for these to be different, then 
>> not
>> define both to ensure it.
> [...]
>
> Exactly!! I don't understand why people keep bringing up 
> non-linear
> partial orderings -- those only apply in a *minority* of cases! 
> (Raise
> your hands if your code depends on non-linear partial 
> orderings. How
> many of you *require* this more often than linear orderings? 
> Yeah, I
> thought so.) Why are we sacrificing *common* case -- where 
> opCmp defines
> a linear ordering -- for the minority case?
>
> And it's not like we're making it impossible in the minority 
> case -- if
> you want a non-linear partial ordering, wouldn't you make sure 
> to define
> both opCmp and opEquals so that they do the right thing? Since 
> it's an
> uncommon use case, people would tend to be more careful when
> implementing it.

Do I miss something or wouldn't an non-linear ordering imply, 
that x.opCmp(y) != 0 for all x,y ∈ T and thus automatically 
generating opEquals to opCmd() == 0 would automatically do the 
right thing in this case?

So the amount of people that require a different opEquals are 
even smaller
and defining opEquals and opCmp for two different orderings is a 
code smell squared.


More information about the Digitalmars-d mailing list