2017-11-07 11:36 GMT+01:00 Thierry Goubier <thierry.goubier@gmail.com>:
2017-11-07 11:24 GMT+01:00 Denis Kudriashov <dionisiydk@gmail.com>:
2017-11-07 9:23 GMT+01:00 Nicolas Cellier <nicolas.cellier.aka.nice@gmai l.com>:
I have other ideas yet.
The selector undefinedFirst is good, but the implementation not so. I don't like the UndefinedSortFunction: too specific, compose oddly...
In the PR, collatedBy: is the way to tell how we sort properties (if you have a better name, go, it's bikesheding day)
"sort by size of name" (people sorted: (#name collatedBy: #size)) = (people sorted: [:p| p name size])
It is nice idea but it should be not bound to sort functions. Because this feature is useful for other block based messages:
people collect: #name >> #size
people select: #name >> #size >> #even
(I use >> as example). Generally it is about functional programming. Would be nice to have this in image because it will simplify scripting a lot. I remember nice set of blog posts from Vassili Bykov about such kind of things http://blog.3plus4.org/2007/03/.
This code has a cost, however.
First, it's rather slow (hidden #perform: in there).
Second, I had a first hand experience that it is making it significantly more complex to understand for newcomers (implying that it creates additional, special semantics compared to basic smalltalk). I know that there is no special semantic involved, but it looks as if to practitionners of other programming languages and their complex semantics.
I do like the SortFunctions idea (and its extension), but it's important IMHO to not make it too cryptic.
That's why I said it is not related to SortFunction. Generally we rarely use symbol for #collect:/#select: in production. But it is supper handy for scripting/debugging/inspecting. I use it all the time. Also performance in that case can be covered by Sista. Another problem: it complicates debugging because it is not easy to step into selector in that case. With block we just press "Through" button and we are done. But I am sure we can improve it too. Our debugger is in our hands. Another advantage of symbol based functions: there is not potential memory leak here. In case of block we always have reference to outer context. So it is dangerous to use blocks in caches for example.
Regards,
Thierry