On Saturday, 13 May 2017 at 12:11:49 UTC, Fool wrote:
Is there any interest in fixing opEquals and opCmp in the spirit(*) of [1]?

Translating the basic idea into the D world would mean:
 - Drop opEquals
 - Encode the type of comparison in the return type of opCmp
 - Adapt lowering

Why?
- Simplicity: there is always only one function that needs to be implemented; - Consistency: implementation at a single place makes it more difficult to get it wrong; - Expressivity: through the return type implementors can unambiguously specify the properties of comparison relations (Equivalence, Equality, PartialOrdering, LinearOrdering, etc.) and algorithms can more precisely specify their requirements (e.g. general sorting requires a weak ordering whereas topological sorting requires a preorder, only);

[1] Herb Sutter: Consistent comparison, P0515 R0, 2017-02-05
URL http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0515r0.pdf

(*) Some aspects of the proposal are unsound but those can be easily fixed.

For most types equality exists (i.e. are all members equal?), but ordering is nonsensical.

to answer your why questions:
1) see above, we're still doing better than C++ (although in the contexts of DLSs individual operator overloading is useful. 2) see 1. you need only define both if opEquals is a requirement for performance. defining opCmp suffices for (in)equality. and you don't define opCmp unless your type has sensible ordering. 3) you can do that already. w.r.t sort you pass a predicate (defaulting to "less") for which ordering is assumed to exist, if it doesn't then you get a partition according to that predicate.

Reply via email to