On Sun, Aug 2, 2015 at 6:44 PM, webwarrior <r...@webwarrior.ws> wrote:

>
> On 02.08.2015 19:02, Peter Uhnák [via Smalltalk] wrote:
>
> >     (a b c) = (b a c) if a = b
> >
> >     (a b c) < (b a c) if a < b
> >     The semantics are well defined.
> >
> >
> > Since you mentioned JavaScript, you should know that you can't compare
> > arrays with ==, because it does object comparison.
> >
> >     No. Sorted collection maintains order of its elements, and I'm
> talking
> >     about order on [the set of] sequencable collections
> >
> > This will make sense only if the objects have overriden their #=.
> > Which also means that it is not very useful to use #<, because you can't
> > define order without overriding #=.
>
> Technically, you can:
>         (a < b) not and: [ (b < a) not ] "a and b are equal"
>

Well if the two objects are not comparable, then you've just made them
equal. :)


>
> But of course it's reasonable to implement #= and #hash along with #< -
> that's what TComparable requires.
>

Implementing #=/#hash just to achieve ordering seems like a terrible idea,
considering #= affects a lot and often it will be context-dependent.
(Sometimes you want to compare objects one way, sometimes another, that's
why there's #sorted: method.)


>
> > Compare it to sorting a collection, where you can either do #sorted,
> > which will do "a <= b" by default, but you can still do #sorted: and
> > specify the sort order, dtto with PluggableDictionary etc.
> > So if anything, it would make more sense to be able to block-based
> > testing (without relying on #<), because more often then not you will
> > have your values wrapped in some (bigger) objects.
>
> Something like #compare:using: where second argument is a binary block?
> Might be a solution, although not as elegant.
> Question is what are return values of the method and what is expected to
> be returned from the block?
> String>>#compare: returns integer from 1 to 3;
> SequencableCollection>>#findBinary: expects either 0, negative or
> positive integer; #sorted: expects boolean; #max:, #min:, etc. expect
> object to be compared.


My point was, that in object world you will usually have more complex
objects than just strings.
For example you have a class "Person" that has "name" and "surname"
attributes.
Suddenly you can't override #=, because it doesn't make sense in context to
lexicographic ordering...
do you want the order to be by name or by surname? Or something else?
That's why I wrote that implementing just #< has very constrained use-case,
because you can't specify what you want to order.
Of course you can do "somePeople collect: #name < (otherPeople collect:
#name)" but you still want it to be done on People collection, not the
collection of strings.

Or maybe I am forcing not very common use case?

Reply via email to