On Wed, Sep 3, 2014 at 8:37 AM, Camille Teruel <[email protected]> wrote:
> > On 3 sept. 2014, at 17:26, Eliot Miranda <[email protected]> wrote: > > > > > On Wed, Sep 3, 2014 at 7:54 AM, Thierry Goubier <[email protected] > > wrote: > >> >> >> >> 2014-09-03 14:40 GMT+02:00 Marcus Denker <[email protected]>: >> >> with:do: on SequencableCollection checks that both collections have the >>> same size (it raises an Error if not). >>> >>> with: otherCollection do: twoArgBlock >>> "Evaluate twoArgBlock with corresponding elements from this >>> collection and otherCollection." >>> otherCollection size = self size ifFalse: [self error: >>> 'otherCollection must be the same size']. >>> 1 to: self size do: >>> [:index | >>> twoArgBlock value: (self at: index) >>> value: (otherCollection at: index)] >>> >>> I think we should not do that: >>> >>> 1) it is slow >>> >> >> Are you sure about that one? The check is a constant cost disregarding >> the collection length, and, anyway, self size is reused just after that. >> >> >>> 2) when the other is larger, is would work and just omit the rest >> >> 3) if it is smaller, you will get an error anyway >>> >> >> I have a feeling I'm not in Pharo anymore, but in R instead ;) >> > > +2. There are clear safety advantages in the check. If you want the > "faster" protocol why not define withSomeOf:do: or some such? > > > Like Thierry I'm not sure that omitting the check brings a significant > speedup. > However, not doing this check follows the robustness principle: "Be > conservative in what you do, be liberal in what you accept from others". > But it violates the "if it ain't broke don't fix it", "it means what it means", and "Smalltalk is a safe language" principles. That safety check finds bugs. If one wants a more relaxed contract, implement a new contract, don't break an existing contract that has stood for years. > I would even be more liberal with a: > 1 to: (self size min: otherCollection size) do: .... > :) > But you can write that if that's what you mean. But arbitrarily changing existing protocol for weak reasons when _it ain't broke_ is a recipe for chaos. Thierry >> >> >>> >>> There are just three methods doing such a size check: >>> >>> with:do: >>> with:collect: >>> reverseWith:do: >>> (the last one actually raises a SizeMismatch exception, it is >>> the sole user of that exception) >>> >>> Is there a reason why this makes sense? >>> >>> I added an issue with a slice to clean it up: >>> >>> >>> https://pharo.fogbugz.com/f/cases/13946/speed-up-with-do-by-not-checking-size >>> >>> Marcus >>> >>> >>> >>> >>> >>> >> > > > -- > best, > Eliot > > > -- best, Eliot
