On 04/24/2017 11:16 AM, Esteban A. Maringolo wrote:> For these use cases it would be nice to have some sort of syntax sugar
as with the cascade operator, but with a chaining operator instead.
This doesn't even require syntactic sugar, just objects, and this is a more general problem even with a back to back chain of select/detect/reject style things. I solved this for myself years ago by introducing what I call a pipe (nod to unix) allowing me to chain calls in a pipeline without all the parens with each call acting on the result value of the last call. Trivially implemented using #doesNotUnderstand: and the cascade operator. ^ dict1 asPipe at: 'key1'; at: 'key2'; at: 'key3'. Anytime I have a bunch of back to back calls that would require a lot of parens, I just create a pipe... maxRoomsAvailable ^self findBlocks asPipe select: [ :e | e blockDate between: actualCheckInDate and: actualCheckInDate + (nights - 1) days ]; detectMin: [ :e | e quantityAvailable ]; quantityAvailable The simplest implementation is... Object>>asPipe ^ SPipe with: self Object subclass: #SPipe instanceVariableNames: 'value' classVariableNames: '' poolDictionaries: '' category: 'PharoExtensions' privateValue: anObject value := anObject yourself ^ value yourself doesNotUnderstand: aMessage ^ value := value perform: aMessage selector withArguments: aMessage arguments SPipe class>>with: anObject ^ (self new) privateValue: anObject; yourself -- Ramon Leon