[squeak-dev] Re:Collection>>sum implementation
Jerome Peace
peace_the_dreamer at yahoo.com
Mon Aug 11 20:15:04 UTC 2008
[squeak-dev] Collection>>sum implementation
Jason Johnson jason.johnson.081 at gmail.com
Mon Aug 11 11:57:54 UTC 2008
Hi Jason,
I remember debugging an instance of this problem a while back.
Ah found it:
http://bugs.squeak.org/view.php?id=6560
[BUG][FIX] "{Color red. Color green. Color blue} sum" can't return "Color white"
The solution was to inject the zero element then sum the whole list.
How do you get a zero element when you don't know what you are dealing with?
You let it tell you:
any := myCollection anyone .
zeroElement := any - any .
answer :=
myCollection inject: zeroElement into: [ :sum :each | sum + each ] .
The mantis report needs to be harvested.
Hth,
Yours in curiosity and service, --Jerome Peace
***
Jason>Hello all,
Jason>
Jason>In my explorations today I happened on the implementation of the #sum
Jason>method:
Jason>
Jason>Collection>>sum
Jason> "This is implemented using a variant of the normal inject:into: pattern.
Jason> The reason for this is that it is not known whether we're in the normal
Jason> number line, i.e. whether 0 is a good initial value for the sum.
Jason> Consider a collection of measurement objects, 0 would be the unitless
Jason> value and would not be appropriate to add with the unit-ed objects."
Jason> | sum sample |
Jason> sample _ self anyOne.
Jason> sum _ self inject: sample into: [:accum :each | accum + each].
Jason> ^ sum - sample
Jason>
Jason>
Jason>Personally, I view the code in the core image to, among other things,
Jason>serve the role of showing new Smalltalk programmers good ways of using
Jason>the language. This is exactly the kind of thing I would *not* want
Jason>people to see.
Jason>
Jason>The obvious issue here is that #inject:into: doesn't fit this case
Jason>very well. But rather then go to these kinds of steps a much better
Jason>solution would be to simply notice that a specialized variation of
Jason>#inject:into: (that is in fact quite common) is needed here. Namely
Jason>a reduction method that just uses the first element as the starting
Jason>value, conceptually:
Jason>
Jason>Collection>>reduce: aBlock
Jason> ^ self allButFirst inject: self first into: aBlock
Jason>
Jason>As it turns out there exists a more efficient implementation of this
Jason>method in Lukas' Magritte-Model package. I would propose his method
Jason>be promoted to a core method so #sum could be rewritten as:
Jason>
Jason>sum
Jason> "sum the reciever"
Jason> ^ self reduce: [:accum :each| accum + each ]
Jason>
Jason>Thanks,
Jason>Jason
***
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20080811/4480f71a/attachment.htm
More information about the Squeak-dev
mailing list
|