On Thu, 11 Mar 2010, Henrik Johansen wrote:



Den 11.03.2010 01:54, skrev Nicolas Cellier:
2010/3/11 Igor Stasenko <siguc...@gmail.com>:

On 10 March 2010 15:07, Nicolas Cellier
<nicolas.cellier.aka.n...@gmail.com> wrote:

self collect: aBlock as: Set


One more time, i found this very beatiful and useful extension to
Collection protocol.
And i am proud being a witness when this thing is born! :)


Yes,
I remember saying I was not convinced some times ago...
http://lists.squeakfoundation.org/pipermail/squeak-dev/2008-June/129457.html
Being able to change own opinion is a good thing !

Nicolas

I have to admit, I still don't quite see what's wrong with
1.
(self collect: aBlock) asSet

('foo' collect: [ :each | each asciiValue ]) asSet "===> boom :)"

or
2.
mySet := Set new: self size.
self do: aBlockAddingToMySetAtEnd.

That's ok, but it's two lines + a temporary declaration.


or (well, this one is IMO indeed a bit ugly)
3.
self inject: (Set new:self size) into:
   [ :sub :next |
    sub add: next collectValue; yourself ] ...

Sure, they're a bit verbose, and when you'd like to use 1 vs 2 or 3
varies abit on the collection contents, but they all work in all
dialects, and aren't THAT much longer, unless your collect block is
really short.

I did a quick sampling (not representative) and found that 1 out of 20 collect blocks is longer than a single line.

#collect:as: is a solution to the problem about #species which limits the use of #collect: in some cases. You can find the proposal about #collect:as: here if you're interested: http://lists.squeakfoundation.org/pipermail/squeak-dev/2009-November/141245.html And who knows, maybe other dialects will implement these methods too, until then, don't use #collect:as: in code which should be portable across dialects.


Levente


Cheers,
Henry

2010/3/10 Mariano Martinez Peck <marianop...@gmail.com>:

Hi. I was needing something like the SQL select distinct, that doesn't take
into account repeated objects. I didn't found anything useful in Collection,
and thus, I have implemented this:

Collection >> collectDistinct: aBlock


collectDistinct: aBlock
    "Evaluate aBlock with each of the receiver's elements as the argument.
    Collect the resulting values into a Set, thus repeated objects will not
be present.
    Answer the new collection."

    | newSet |
    newSet := self species new asSet.
    self do: [:each | newSet add: (aBlock value: each)].
    ^ newSet


Is there a better way ?   Do you think it make sense to put this in Pharo ?

Cheers

Mariano

_______________________________________________
Pharo-project mailing list
Pharo-project@lists.gforge.inria.fr
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project


_______________________________________________
Pharo-project mailing list
Pharo-project@lists.gforge.inria.fr
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project




--
Best regards,
Igor Stasenko AKA sig.

_______________________________________________
Pharo-project mailing list
Pharo-project@lists.gforge.inria.fr
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

_______________________________________________
Pharo-project mailing list
Pharo-project@lists.gforge.inria.fr
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project




_______________________________________________
Pharo-project mailing list
Pharo-project@lists.gforge.inria.fr
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project


_______________________________________________
Pharo-project mailing list
Pharo-project@lists.gforge.inria.fr
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to