Thanks Clément, but it was really easy and trivial - Nicolai did the hard work 
with the pragma builder.

I was wondering, does the optimiser also deal with #to:do:by as well as #to:do: 
?

On 10 Sep 2014, at 10:13, Clément Bera <bera.clem...@gmail.com> wrote:

> I like your slice Sven. The code is easier to read now in OrderedCollection 
> and my optimizer can perform better.
> 
> Thanks :)
> 
> 2014-09-10 9:04 GMT+02:00 Sven Van Caekenberghe <s...@stfx.eu>:
> I added a slice for 
> https://pharo.fogbugz.com/f/cases/13985/OrderedCollection-do-and-reverseDo-are-not-consistent-with-the-other-enumerations
> 
> On 09 Sep 2014, at 12:53, Nicolai Hess <nicolaih...@web.de> wrote:
> 
> > fogbugz entry for fixing the menu builder
> > 13979
> > PragmaMenuBuilder relies on modifying a collection while iterating over it.
> >
> >
> >
> >
> > 2014-09-03 22:59 GMT+02:00 stepharo <steph...@free.fr>:
> > Clement we should fix the code of the menu :)
> >
> > Stef
> >
> >
> > On 3/9/14 15:25, Clément Bera wrote:
> >> Hello,
> >>
> >> Sven you are right, the old compiler was consistent in the sense that it 
> >> always iterated over all the elements, including the ones added with #add: 
> >> and #addLast: while iterating over the collection.
> >> On the other hand, VW is consistent with the Opal implementation for 
> >> #to:do: in the sense that they iterate only on the elements of the 
> >> collection excluding the ones added while iterating.
> >>
> >> #add:after: and co do not work well if you edit the collection while 
> >> iterating over it for sure :).
> >>
> >> It's too late for "don't modify a collection while iterating it" because 
> >> the system does it, for example, to build the world menu. So I think the 
> >> solution is in two steps:
> >> - removing code which edit the collection while iterating over it. As most 
> >> frameworks work both on Pharo and VW and that the behavior is different I 
> >> think there shouldn't be that much, so fixing the Pharo image may be 
> >> enough.
> >> - be consistent in our collection protocol, basically by rewriting do: and 
> >> reverseDo: like that:
> >>
> >> FROM:
> >> do: aBlock
> >>  "Override the superclass for performance reasons."
> >>  | index |
> >>  index := firstIndex.
> >>  [index <= lastIndex]
> >>  whileTrue:
> >>  [aBlock value: (array at: index).
> >>  index := index + 1]
> >> TO:
> >> do: aBlock
> >>  "Override the superclass for performance reasons."
> >>  firstIndex to: lastIndex do: [ :index |
> >>  aBlock value: (array at: index) ]
> >>
> >>
> >>
> >>
> >>
> >> 2014-09-03 14:05 GMT+02:00 Camille Teruel <camille.ter...@gmail.com>:
> >>
> >> On 3 sept. 2014, at 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.
> >> >
> >> > 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 ?
> >>
> >>
> >> The thing is to find alternative implementations that are efficient enough 
> >> (no copy). Maybe we can get some inspirations from VW for that (how do 
> >> they do BTW?).
> >> You should also check with other kinds of collection because they may act 
> >> differently than OrderedCollection.
> >> So in the end it depends on the amount of effort needed to make all 
> >> collections consistent with this new requirement and on the resulting 
> >> overhead.
> >> If it's too much, I think that following the old advice "don't modify a 
> >> collection while iterating it" is enough. If one really needs to do such 
> >> kind of things he should consider an alternative design like using a 
> >> zipper for example.
> >>
> >> Camille
> >>
> >> >
> >> > Clement
> >> >
> >>
> >>
> >>
> >
> >
> 
> 
> 


Reply via email to