[squeak-dev] Collection>>sum implementation
jason.johnson.081 at gmail.com
Mon Aug 11 11:57:54 UTC 2008
In my explorations today I happened on the implementation of the #sum method:
"This is implemented using a variant of the normal inject:into: pattern.
The reason for this is that it is not known whether we're in the normal
number line, i.e. whether 0 is a good initial value for the sum.
Consider a collection of measurement objects, 0 would be the unitless
value and would not be appropriate to add with the unit-ed objects."
| sum sample |
sample _ self anyOne.
sum _ self inject: sample into: [:accum :each | accum + each].
^ sum - sample
Personally, I view the code in the core image to, among other things,
serve the role of showing new Smalltalk programmers good ways of using
the language. This is exactly the kind of thing I would *not* want
people to see.
The obvious issue here is that #inject:into: doesn't fit this case
very well. But rather then go to these kinds of steps a much better
solution would be to simply notice that a specialized variation of
#inject:into: (that is in fact quite common) is needed here. Namely
a reduction method that just uses the first element as the starting
^ self allButFirst inject: self first into: aBlock
As it turns out there exists a more efficient implementation of this
method in Lukas' Magritte-Model package. I would propose his method
be promoted to a core method so #sum could be rewritten as:
"sum the reciever"
^ self reduce: [:accum :each| accum + each ]
More information about the Squeak-dev