You wrote "In general reversed/converse has no meaning for block."
That's entirely an artefact of representing blocks of different
arities by the same class.�� In my own Smalltalk, NiladicBlock,
MonadicBlock, DyadicBlock, ... are different classes.�� To put it
another way, your statement has exactly the same status as
"In general #value:value: has no meaning for block."
#converse has meaning for *all* DyadicBlocks, it is the
combinator flip f x y = f y x.�� For that matter, it could
be generalised to all blocks of arity >= 2 as
[:a1 :a2 ... :an | body] converse
=> [:a2 :a1 ... :an | body]
i.e., flip the first two arguments.
My original implementation of #converse was
DyadicBlock
�� methods for: 'combinators'
������ converse
���������� ^[:x :y | self value: y value: x]
������ "other combinators"
With a suitable set of combinators, I can do things like
#name ascending thenBy: #age descending thenBy: #weight ascending nilsFirst
without needing a SortFunction class.
���I do like the fact that SortFunction can support both 2-way and 3-way���
comparison.