Common enough to include it?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Common enough to include it?

Sebastian Sastre-2
Hi there,

        I've found a couple of simple but nice conveniences in collections:

        A) To be able to do things like:
       
                persons collectAspect: #surname

collectAspect: aSymbol
        "Collects the element's answer to aSymbol"
        ^ self collect:[:each| each perform: aSymbol]

        B) To be able to do things like:

                1 to: 12 collect:[:i| (Month nameOfMonth: i) asString ]

to: stop collect: aBlock
        "Evaluate aBlock and adds it's answer to results
        for each element of the interval (self to: stop by: 1)."
        | nextValue results |
        nextValue _ self.
        results := OrderedCollection new.
        [nextValue <= stop]
                whileTrue:
                        [results add: (aBlock value: nextValue).
                        nextValue _ nextValue + 1].
        ^ results

        Maybe they are universal enough to include in base?

        cheers,
       
Sebastian Sastre
PS: I'm proposing to use this #collectAspect: in the very same way of #pluck
as you can found it in Prototype enumerable, a kind of collection
abstraction for javascript.


Reply | Threaded
Open this post in threaded view
|

Re: Common enough to include it?

Andreas.Raab
Both patterns effectively exist:

   (1 to: 3) collect: #printString

Cheers,
   - Andreas

Sebastian Sastre wrote:

> Hi there,
>
> I've found a couple of simple but nice conveniences in collections:
>
> A) To be able to do things like:
>
> persons collectAspect: #surname
>
> collectAspect: aSymbol
> "Collects the element's answer to aSymbol"
> ^ self collect:[:each| each perform: aSymbol]
>
> B) To be able to do things like:
>
> 1 to: 12 collect:[:i| (Month nameOfMonth: i) asString ]
>
> to: stop collect: aBlock
> "Evaluate aBlock and adds it's answer to results
> for each element of the interval (self to: stop by: 1)."
> | nextValue results |
> nextValue _ self.
> results := OrderedCollection new.
> [nextValue <= stop]
> whileTrue:
> [results add: (aBlock value: nextValue).
> nextValue _ nextValue + 1].
> ^ results
>
> Maybe they are universal enough to include in base?
>
> cheers,
>
> Sebastian Sastre
> PS: I'm proposing to use this #collectAspect: in the very same way of #pluck
> as you can found it in Prototype enumerable, a kind of collection
> abstraction for javascript.
>
>
>


Reply | Threaded
Open this post in threaded view
|

RE: Common enough to include it?

Sebastian Sastre-2
Oh great. I had the idea that they where accepting only blocks. Cool,

        cheers,

Sebastian Sastre

 

> -----Mensaje original-----
> De: [hidden email]
> [mailto:[hidden email]] En
> nombre de Andreas Raab
> Enviado el: Martes, 22 de Enero de 2008 15:15
> Para: The general-purpose Squeak developers list
> Asunto: Re: Common enough to include it?
>
> Both patterns effectively exist:
>
>    (1 to: 3) collect: #printString
>
> Cheers,
>    - Andreas
>
> Sebastian Sastre wrote:
> > Hi there,
> >
> > I've found a couple of simple but nice conveniences in
> collections:
> >
> > A) To be able to do things like:
> >
> > persons collectAspect: #surname
> >
> > collectAspect: aSymbol
> > "Collects the element's answer to aSymbol"
> > ^ self collect:[:each| each perform: aSymbol]
> >
> > B) To be able to do things like:
> >
> > 1 to: 12 collect:[:i| (Month nameOfMonth: i) asString ]
> >
> > to: stop collect: aBlock
> > "Evaluate aBlock and adds it's answer to results
> > for each element of the interval (self to: stop by: 1)."
> > | nextValue results |
> > nextValue _ self.
> > results := OrderedCollection new.
> > [nextValue <= stop]
> > whileTrue:
> > [results add: (aBlock value: nextValue).
> > nextValue _ nextValue + 1].
> > ^ results
> >
> > Maybe they are universal enough to include in base?
> >
> > cheers,
> >
> > Sebastian Sastre
> > PS: I'm proposing to use this #collectAspect: in the very
> same way of
> > #pluck as you can found it in Prototype enumerable, a kind of
> > collection abstraction for javascript.
> >
> >
> >
>
>


Reply | Threaded
Open this post in threaded view
|

Re: Common enough to include it?

Bert Freudenberg
They "accept" anything that understands #value:. There are different  
opinions about Symbol>>#value: being a good idea or not. It's  
certainly convenient.

- Bert -


On Jan 22, 2008, at 18:35 , Sebastian Sastre wrote:

> Oh great. I had the idea that they where accepting only blocks. Cool,
>
> cheers,
>
> Sebastian Sastre
>
>
>
>> -----Mensaje original-----
>> De: [hidden email]
>> [mailto:[hidden email]] En
>> nombre de Andreas Raab
>> Enviado el: Martes, 22 de Enero de 2008 15:15
>> Para: The general-purpose Squeak developers list
>> Asunto: Re: Common enough to include it?
>>
>> Both patterns effectively exist:
>>
>>    (1 to: 3) collect: #printString
>>
>> Cheers,
>>    - Andreas
>>
>> Sebastian Sastre wrote:
>>> Hi there,
>>>
>>> I've found a couple of simple but nice conveniences in
>> collections:
>>>
>>> A) To be able to do things like:
>>>
>>> persons collectAspect: #surname
>>>
>>> collectAspect: aSymbol
>>> "Collects the element's answer to aSymbol"
>>> ^ self collect:[:each| each perform: aSymbol]
>>>
>>> B) To be able to do things like:
>>>
>>> 1 to: 12 collect:[:i| (Month nameOfMonth: i) asString ]
>>>
>>> to: stop collect: aBlock
>>> "Evaluate aBlock and adds it's answer to results
>>> for each element of the interval (self to: stop by: 1)."
>>> | nextValue results |
>>> nextValue _ self.
>>> results := OrderedCollection new.
>>> [nextValue <= stop]
>>> whileTrue:
>>> [results add: (aBlock value: nextValue).
>>> nextValue _ nextValue + 1].
>>> ^ results
>>>
>>> Maybe they are universal enough to include in base?
>>>
>>> cheers,
>>>
>>> Sebastian Sastre
>>> PS: I'm proposing to use this #collectAspect: in the very
>> same way of
>>> #pluck as you can found it in Prototype enumerable, a kind of
>>> collection abstraction for javascript.
>>>
>>>
>>>
>>
>>
>
>




Reply | Threaded
Open this post in threaded view
|

RE: Common enough to include it?

Sebastian Sastre-2
Hi Bert,

        as a convenience I don't present objections. The usability problem I
saw on that is the convenience being a hidden feature. Ofcourse
Collection>>"collect: aValuableOrSymbol" could suggest it's existence
palliating that.

        cheers,

Sebastian Sastre


> -----Mensaje original-----
> De: [hidden email]
> [mailto:[hidden email]] En
> nombre de Bert Freudenberg
> Enviado el: Martes, 22 de Enero de 2008 15:41
> Para: The general-purpose Squeak developers list
> Asunto: Re: Common enough to include it?
>
> They "accept" anything that understands #value:. There are
> different opinions about Symbol>>#value: being a good idea or
> not. It's certainly convenient.
>
> - Bert -
>
>
> On Jan 22, 2008, at 18:35 , Sebastian Sastre wrote:
>
> > Oh great. I had the idea that they where accepting only
> blocks. Cool,
> >
> > cheers,
> >
> > Sebastian Sastre
> >
> >
> >
> >> -----Mensaje original-----
> >> De: [hidden email]
> >> [mailto:[hidden email]] En
> nombre de
> >> Andreas Raab Enviado el: Martes, 22 de Enero de 2008 15:15
> >> Para: The general-purpose Squeak developers list
> >> Asunto: Re: Common enough to include it?
> >>
> >> Both patterns effectively exist:
> >>
> >>    (1 to: 3) collect: #printString
> >>
> >> Cheers,
> >>    - Andreas
> >>
> >> Sebastian Sastre wrote:
> >>> Hi there,
> >>>
> >>> I've found a couple of simple but nice conveniences in
> >> collections:
> >>>
> >>> A) To be able to do things like:
> >>>
> >>> persons collectAspect: #surname
> >>>
> >>> collectAspect: aSymbol
> >>> "Collects the element's answer to aSymbol"
> >>> ^ self collect:[:each| each perform: aSymbol]
> >>>
> >>> B) To be able to do things like:
> >>>
> >>> 1 to: 12 collect:[:i| (Month nameOfMonth: i) asString ]
> >>>
> >>> to: stop collect: aBlock
> >>> "Evaluate aBlock and adds it's answer to results
> >>> for each element of the interval (self to: stop by: 1)."
> >>> | nextValue results |
> >>> nextValue _ self.
> >>> results := OrderedCollection new.
> >>> [nextValue <= stop]
> >>> whileTrue:
> >>> [results add: (aBlock value: nextValue).
> >>> nextValue _ nextValue + 1].
> >>> ^ results
> >>>
> >>> Maybe they are universal enough to include in base?
> >>>
> >>> cheers,
> >>>
> >>> Sebastian Sastre
> >>> PS: I'm proposing to use this #collectAspect: in the very
> >> same way of
> >>> #pluck as you can found it in Prototype enumerable, a kind of
> >>> collection abstraction for javascript.
> >>>
> >>>
> >>>
> >>
> >>
> >
> >
>
>
>
>


Reply | Threaded
Open this post in threaded view
|

RE: Common enough to include it?

Ron Teitelbaum
Hi All,

This was my objection too.  There was someone on the beginners list that was
having trouble reading similar code.  When it turned out to be a trick of
Symbol>>value, I recommended not using it because it was hidden and hard for
some users to understand.  

collect: aBlockOrSymbol  
        "Symbols can be sent in as a message to be performed.  Results are
collected for each element.
        see: Symbol>>value"

might make it easier to understand, but it still feels like a trick.

Ron

> -----Original Message-----
> From: Sebastian Sastre
>
> Hi Bert,
>
> as a convenience I don't present objections. The usability problem I
> saw on that is the convenience being a hidden feature. Ofcourse
> Collection>>"collect: aValuableOrSymbol" could suggest it's existence
> palliating that.
>
> cheers,
>
> Sebastian Sastre
>
>
> > -----Mensaje original-----
> > De: [hidden email]
> > [mailto:[hidden email]] En
> > nombre de Bert Freudenberg
> > Enviado el: Martes, 22 de Enero de 2008 15:41
> > Para: The general-purpose Squeak developers list
> > Asunto: Re: Common enough to include it?
> >
> > They "accept" anything that understands #value:. There are
> > different opinions about Symbol>>#value: being a good idea or
> > not. It's certainly convenient.
> >
> > - Bert -
> >
> >
> > On Jan 22, 2008, at 18:35 , Sebastian Sastre wrote:
> >
> > > Oh great. I had the idea that they where accepting only
> > blocks. Cool,
> > >
> > > cheers,
> > >
> > > Sebastian Sastre
> > >
> > >
> > >
> > >> -----Mensaje original-----
> > >> De: [hidden email]
> > >> [mailto:[hidden email]] En
> > nombre de
> > >> Andreas Raab Enviado el: Martes, 22 de Enero de 2008 15:15
> > >> Para: The general-purpose Squeak developers list
> > >> Asunto: Re: Common enough to include it?
> > >>
> > >> Both patterns effectively exist:
> > >>
> > >>    (1 to: 3) collect: #printString
> > >>
> > >> Cheers,
> > >>    - Andreas
> > >>
> > >> Sebastian Sastre wrote:
> > >>> Hi there,
> > >>>
> > >>> I've found a couple of simple but nice conveniences in
> > >> collections:
> > >>>
> > >>> A) To be able to do things like:
> > >>>
> > >>> persons collectAspect: #surname
> > >>>
> > >>> collectAspect: aSymbol
> > >>> "Collects the element's answer to aSymbol"
> > >>> ^ self collect:[:each| each perform: aSymbol]
> > >>>
> > >>> B) To be able to do things like:
> > >>>
> > >>> 1 to: 12 collect:[:i| (Month nameOfMonth: i)
asString ]

> > >>>
> > >>> to: stop collect: aBlock
> > >>> "Evaluate aBlock and adds it's answer to results
> > >>> for each element of the interval (self to: stop by: 1)."
> > >>> | nextValue results |
> > >>> nextValue _ self.
> > >>> results := OrderedCollection new.
> > >>> [nextValue <= stop]
> > >>> whileTrue:
> > >>> [results add: (aBlock value: nextValue).
> > >>> nextValue _ nextValue + 1].
> > >>> ^ results
> > >>>
> > >>> Maybe they are universal enough to include in base?
> > >>>
> > >>> cheers,
> > >>>
> > >>> Sebastian Sastre
> > >>> PS: I'm proposing to use this #collectAspect: in the very
> > >> same way of
> > >>> #pluck as you can found it in Prototype enumerable, a kind of
> > >>> collection abstraction for javascript.
> > >>>
> > >>>
> > >>>
> > >>
> > >>
> > >
> > >
> >
> >
> >
> >
>



Reply | Threaded
Open this post in threaded view
|

Re: Common enough to include it?

Paolo Bonzini-2
In reply to this post by Sebastian Sastre-2
Sebastian Sastre wrote:
> Hi Bert,
>
> as a convenience I don't present objections. The usability problem I
> saw on that is the convenience being a hidden feature. Ofcourse
> Collection>>"collect: aValuableOrSymbol" could suggest it's existence
> palliating that.

The biggest problem is that you define Symbol>>#value: and friends to
make Symbols and BlockClosures polymorphic with each other.  But then
#numArgs is not polymorphic because

   #asLowercase numArgs => 0
   [ :x | x asLowercase ] => 1

Paolo