Hi All This is an idiot question, I should know the answer, but I have looked around and can't find relevant documentation. I'm not asking for a full answer, just a pointer as to where to start looking. I have seen from examples in this forum that an expression like the following: paras collect: [para| para prettyPrinted] can be written more concisely as: paras collect: #prettyPrinted which obviously works when I try it. It doesn't seem to fit in with the definition of #collect:, which requires a block as argument. Where can I find the relevant definition, either in method comments or in some general manual? Can the notation be extended, for example to #select: - obviously with an argument which returns a Boolean? Can it be used with a method which requires an argument, e.g. as myArray collect: (#myMethod: arg)? Are there any other extensions? Any help gratefully received. Peter Kenny
On Tue, 11 Sep 2018 at 02:44, PBKResearch <peter@pbkresearch.co.uk> wrote:
Hi All
This is an idiot question, I should know the answer, but I have looked around and canât find relevant documentation. Iâm not asking for a full answer, just a pointer as to where to start looking.
I have seen from examples in this forum that an expression like the following:
paras collect: [para| para prettyPrinted]
can be written more concisely as:
paras collect: #prettyPrinted
which obviously works when I try it. It doesnât seem to fit in with the definition of #collect:, which requires a block as argument. Where can I find the relevant definition, either in method comments or in some general manual? Can the notation be extended,
Its not special notation. Just a normal object (a Symbol) passed via a normal message.
for example to #select: - obviously with an argument which returns a Boolean? Can it be used with a method which requires an argument, e.g. as myArray collect: (#myMethod: arg)? Are there any other extensions?
Any help gratefully received.
Peter Kenny
Full answer ;) Its a combination of the following two methods... Collection >> collect: aBlock | newCollection | newCollection := self species new. self do: [:each | newCollection add: (aBlock value: each)]. ^ newCollection Symbol value: anObject ^anObject perform: self. When /aBlock/ is a symbol, that symbol is performed on /each/ element. And looking at #select: , yes it works the same... Collection >> select: aBlock | newCollection | newCollection := self copyEmpty. self do: [ :each | (aBlock value: each) ifTrue: [ newCollection add: each ]]. ^newCollection cheers -ben
Thanks Ben â itâs all clear now. Thanks also to Esteban, who spared my blushes by answering direct! Peter Kenny From: Pharo-users <pharo-users-bounces@lists.pharo.org> On Behalf Of Ben Coman Sent: 10 September 2018 19:56 To: Any question about pharo is welcome <pharo-users@lists.pharo.org> Subject: Re: [Pharo-users] Query on Pharo syntax On Tue, 11 Sep 2018 at 02:44, PBKResearch <peter@pbkresearch.co.uk <mailto:peter@pbkresearch.co.uk> > wrote: Hi All This is an idiot question, I should know the answer, but I have looked around and canât find relevant documentation. Iâm not asking for a full answer, just a pointer as to where to start looking. I have seen from examples in this forum that an expression like the following: paras collect: [para| para prettyPrinted] can be written more concisely as: paras collect: #prettyPrinted which obviously works when I try it. It doesnât seem to fit in with the definition of #collect:, which requires a block as argument. Where can I find the relevant definition, either in method comments or in some general manual? Can the notation be extended, Its not special notation. Just a normal object (a Symbol) passed via a normal message. for example to #select: - obviously with an argument which returns a Boolean? Can it be used with a method which requires an argument, e.g. as myArray collect: (#myMethod: arg)? Are there any other extensions? Any help gratefully received. Peter Kenny Full answer ;) Its a combination of the following two methods... Collection >> collect: aBlock | newCollection | newCollection := self species new. self do: [:each | newCollection add: (aBlock value: each)]. ^ newCollection Symbol value: anObject ^anObject perform: self. When /aBlock/ is a symbol, that symbol is performed on /each/ element. And looking at #select: , yes it works the same... Collection >> select: aBlock | newCollection | newCollection := self copyEmpty. self do: [ :each | (aBlock value: each) ifTrue: [ newCollection add: each ]]. ^newCollection cheers -ben
Its a very interesting and elegant aspect of Pharo and I'm sure there are others at different parts of their journey learning Pharo who learnt something new from your question. cheers -ben On Tue, 11 Sep 2018 at 03:13, PBKResearch <peter@pbkresearch.co.uk> wrote:
Thanks Ben â itâs all clear now. Thanks also to Esteban, who spared my blushes by answering direct!
Peter Kenny
*From:* Pharo-users <pharo-users-bounces@lists.pharo.org> *On Behalf Of *Ben Coman *Sent:* 10 September 2018 19:56 *To:* Any question about pharo is welcome <pharo-users@lists.pharo.org> *Subject:* Re: [Pharo-users] Query on Pharo syntax
On Tue, 11 Sep 2018 at 02:44, PBKResearch <peter@pbkresearch.co.uk> wrote:
Hi All
This is an idiot question, I should know the answer, but I have looked around and canât find relevant documentation. Iâm not asking for a full answer, just a pointer as to where to start looking.
I have seen from examples in this forum that an expression like the following:
paras collect: [para| para prettyPrinted]
can be written more concisely as:
paras collect: #prettyPrinted
which obviously works when I try it. It doesnât seem to fit in with the definition of #collect:, which requires a block as argument. Where can I find the relevant definition, either in method comments or in some general manual? Can the notation be extended,
Its not special notation. Just a normal object (a Symbol) passed via a normal message.
for example to #select: - obviously with an argument which returns a Boolean? Can it be used with a method which requires an argument, e.g. as myArray collect: (#myMethod: arg)? Are there any other extensions?
Any help gratefully received.
Peter Kenny
Full answer ;)
Its a combination of the following two methods...
Collection >> collect: aBlock
| newCollection |
newCollection := self species new.
self do: [:each | newCollection add: (aBlock value: each)].
^ newCollection
Symbol value: anObject
^anObject perform: self.
When /aBlock/ is a symbol, that symbol is performed on /each/ element.
And looking at #select: , yes it works the same...
Collection >> select: aBlock
| newCollection |
newCollection := self copyEmpty.
self do: [ :each |
(aBlock value: each)
ifTrue: [ newCollection add: each ]].
^newCollection
cheers -ben
I learned something for sure from this exchange. Thanks Peter and Ben for this public conversation. Cheers, Offray On 9/10/18 7:56 PM, Ben Coman wrote:
Its a very interesting and elegant aspect of Pharo and I'm sure there are others at different parts of their journey learning Pharo who learnt something new from your question.Â
cheers -ben
On Tue, 11 Sep 2018 at 03:13, PBKResearch <peter@pbkresearch.co.uk <mailto:peter@pbkresearch.co.uk>> wrote:
Thanks Ben â itâs all clear now. Thanks also to Esteban, who spared my blushes by answering direct!
Peter Kenny
Â
*From:*Pharo-users <pharo-users-bounces@lists.pharo.org <mailto:pharo-users-bounces@lists.pharo.org>> *On Behalf Of *Ben Coman *Sent:* 10 September 2018 19:56 *To:* Any question about pharo is welcome <pharo-users@lists.pharo.org <mailto:pharo-users@lists.pharo.org>> *Subject:* Re: [Pharo-users] Query on Pharo syntax
Â
Â
On Tue, 11 Sep 2018 at 02:44, PBKResearch <peter@pbkresearch.co.uk <mailto:peter@pbkresearch.co.uk>> wrote:
Hi All
Â
This is an idiot question, I should know the answer, but I have looked around and canât find relevant documentation. Iâm not asking for a full answer, just a pointer as to where to start looking.
Â
I have seen from examples in this forum that an expression like the following:
Â
paras collect: [para| para prettyPrinted]
Â
can be written more concisely as:
Â
paras collect: #prettyPrinted
Â
which obviously works when I try it. It doesnât seem to fit in with the definition of #collect:, which requires a block as argument. Where can I find the relevant definition, either in method comments or in some general manual? Can the notation be extended,
Â
Its not special notation. Just a normal object (a Symbol) passed via a normal message.
Â
for example to #select: - obviously with an argument which returns a Boolean? Can it be used with a method which requires an argument, e.g. as myArray collect: (#myMethod: arg)? Are there any other extensions?
Â
Any help gratefully received.
Â
Peter Kenny
Â
Full answer ;)
Its a combination of the following two methods...
Â
Collection >> collect: aBlockÂ
              | newCollection |
              newCollection := self species new.
              self do: [:each | newCollection add: (aBlock value: each)].
              ^ newCollectionÂ
Â
Symbol value: anObjectÂ
              ^anObject perform: self.
Â
When /aBlock/ is a symbol, that symbol is performed on /each/ element.
And looking at #select: , yes it works the same...Â
Â
Collection >> select: aBlockÂ
              | newCollection |
              newCollection := self copyEmpty.
              self do: [ :each |Â
                             (aBlock value: each)Â
                                            ifTrue: [ newCollection add: each ]].
              ^newCollection
Â
cheers -ben
participants (3)
-
Ben Coman -
Offray Vladimir Luna Cárdenas -
PBKResearch