On 3 September 2014 11:42, Clément Bera <bera.clem...@gmail.com> wrote:

> Hello guys,
>
> I was looking into the OrderedCollection protocols recently to see how
> well the sista optimizer perform with it methods, and I realized that this
> is completely broken.
>
> For example:
>
> col := #(1 2 3 4 5) asOrderedCollection.
> col do: [ :elem | elem trace .
> elem < 4 ifTrue: [ col add: col size + 1 ]].
>
> => '12345678'
>
> However:
>
> col := #(1 2 3 4 5) asOrderedCollection.
> col collect: [ :elem | elem trace .
> elem < 4 ifTrue: [ col add: col size + 1 ]].
>
> => '12345'
>
> This means that #do: and #reverseDo: iterate over all the elements of the
> collection,*including* the ones that you are adding while iterating over
> the collection, whereas all the other OrderedCollection protocols, such as
> #collect:, #select:, iterates over all the elements of the collection,
> *excluding* the ones you are adding while iterating over the collection.
>
> Marcus argued that one should not edit a collection while iterating over
> it, however this point is not valid as the World menu relies on this
> feature, using #do: to iterate over the elements of the OrderedCollection
> including the one it is adding while iterating over the collection.
> Changing the implementation makes the world menu display half of its items.
>
> I don't like this difference because it is inconsistent. For example,
> refactoring a #do: into a #collect: can simply not work because they do not
> iterate over the same elements if you are editing the collection while
> iterating over it.
>
> An arbitrary rule. The whole world does not defines what to expect from
collection when you modifying it during iterating over it.. You can
introduce any rule.. but don't expect this won't surprise the users..
because there's no obvious / 'least surprising' behavior can be defined.


> In VW, the protocols are consistent and iterating over a collection never
> iterates over the elements one is adding while iterating over it.
> Therefore, I believe most frameworks should expect this behavior (at least
> the ones cross smalltalk) which sounds the most correct.
>
> I think we should fix the world menu implementation and make the protocols
> consistent. Alternatively, we can let VW be a much more consistent
> Smalltalk environment than Pharo. What do you think ?
>
>
Wrong wrong wrong..
you either iterate over collection, or modify it.. not both.
We must fix wrong uses of collections.. not collection. It is all right
with collection implementation. You put expectations into a place where
should be none:
the behavior of iterating over collection while modifying it is *undefined*
That's the only rule which should be there. Period.


> Clement
>
>

-- 
Best regards,
Igor Stasenko.

Reply via email to