I would just remove the method. Probably the best fix ever.
---------- Forwarded message ----------
From: Larry White <ljw1001@gmail.com>
Date: Tue, Jan 10, 2012 at 12:52 AM
Subject: Re: [Pharo-users] another confusing result
To: A friendly place where any question about pharo is welcome <pharo-users@lists.gforge.inria.fr>
Thanks. �I wonder if this method needs to stay the same for compatibility reasons or if it could be modified in Pharo to produce a less surprising result. In other words, is this a bug or a feature?�On Mon, Jan 9, 2012 at 1:41 PM, Runar Jordahl <runar.jordahl@gmail.com> wrote:Here is a copy of something I wrote about this earlier:
In Pharo 1.3, SequenceableCollection>>combinations:atATimeDo: will,
for all combinations, send the same collection instance as argument
for the block. Therefore, if you use this collection itself, you will
be surprised:
|answer|
answer := OrderedCollection new.
#(a b c) combinations: 2 atATimeDo: [:each | answer add: each].
answer
Here I expect to end up with a collection looking like this:
1: �#(#a #b)
2: �#(#a #c)
3: �#(#b #c)
But I end up with:
1: �#(#c #c)
2: �#(#c #c)
3: �#(#c #c)
One fix is to change the client code to copy the argument for the block:
|answer|
answer := OrderedCollection new.
#(a b c) combinations: 2 atATimeDo: [:each | answer add: each copy].
answer
Another solution is enhancing
SequenceableCollection>>combinationsAt:in:after:do: to copy the
collection:
nn + 1 to: self size do: [ :index |
� � � � � � � aCollection at: jj put: (self at: index).� � � � � � � � � � � ifTrue: [ aBlock value: aCollection copy ]
� � � � � � � jj = aCollection size
� � � � � � � � � � � ifFalse: [Kind regards
� � � � � � � � � � � � � � � self
� � � � � � � � � � � � � � � � � � � combinationsAt: jj + 1
� � � � � � � � � � � � � � � � � � � in: aCollection
� � � � � � � � � � � � � � � � � � � after: index
� � � � � � � � � � � � � � � � � � � do: aBlock ] ]
Runar Jordahl
--
Mariano
http://marianopeck.wordpress.com