Hi,

indeed, transducers provided a way to achieve this, e.g.

#(12 7 'a' nil #(0)) pipe
        filter: #notNil;
        filter: #isNumber;
        map: #squared;
        filter: #even;
        into: OrderedCollection.

But this feature is deprecated, as it was not that useful. The preferred way to do this is either:

#(12 7 'a' nil #(0))
        transduce: #notNil filter * #isNumber filter * squared map * #even 
filter
        reduce: Set accumulate.

or:

Set <~ #even filter
    <~ #squared map
    <~ #isNumber filter
    <~ #notNil filter
    <~ #(12 7 'a' nil #(0)).

The advantage of the transducer approach is that it decouples filtering/mapping/etc. from iteration and aggregation. This facilitates reuse and makes it trivial to provide all operations to new custom data types.

However, I didn't have time to finish the Pharo port of Transducers, yet. Hence, the a current version is available in Cincom's Public Store or (most current) directly from me only. But if you are interested and have a nice use case, I'd be happy to help out.

Best, Steffen


Am .10.2018, 08:45 Uhr, schrieb Julien <julien.delplan...@inria.fr>:

I think this was the idea of Transducers as well.

Julien

---
Julien Delplanque
Doctorant à l’Université de Lille
http://juliendelplanque.be/phd.html
Equipe Rmod, Inria
Bâtiment B 40, Avenue Halley 59650 Villeneuve d'Ascq
Numéro de téléphone: +333 59 35 86 40

Le 17 oct. 2018 à 09:13, Peter Uhnak <i.uh...@gmail.com> a écrit :

Hi,

is there some library that will allow me to chain select:/collect:/... via cascade?

E.g.

#(12 7 'a' nil #(0)) query reject: #isNil; select: #isNumber; collect: #squared; select: #even?

The point is to not have to write billion parentheses when building a more complex query.

I imagine this would be pretty easy to write, but figured I ask first.

Thanks,
Peter

Reply via email to