> On 20 Dec 2015, at 14:10, Tudor Girba <tu...@tudorgirba.com> wrote:
> 
> Hi,
> 
> Could we not have sum, but sumNumbers instead? So, we would end up with:
> 
> sum:ifEmpty:
> sum: (with error)
> sumNumbers (without error)
> 
> From the outside, #sum: looks like it should parameterize #sum, but the 
> implementation is actually different. So, given that in this implementation 
> #sum is not a special case of #sum: the two should be named differently to 
> reflect that difference. Hence my proposal is to keep #sumNumbers instead of 
> #sum.

I could live with that. We would sacrifice the beautiful selector #sum for the 
more intention revealing #sumNumbers. I think that makes sense.

Concerning the #min and #max methods that means we’d end up with e.g. 
#minNumbers, #min: and #min:ifEmpty: etc.

> 
> Cheers,
> Doru
> 
> 
>> On Dec 20, 2015, at 1:47 PM, Max Leske <maxle...@gmail.com> wrote:
>> 
>>> 
>>> On 20 Dec 2015, at 13:43, Gabriel Cotelli <g.cote...@gmail.com> wrote:
>>> 
>>> Max,
>>> 
>>> sum: aBlock ifEmpty: emptyBlock needs to obtain the sample evaluating the 
>>> block.
>>> 
>>> sum: aBlock ifEmpty: emptyBlock
>>>     | sum sample |
>>>     self isEmpty ifTrue: [ ^ emptyBlock value ].
>>>     sample := aBlock value: self anyOne.
>>>     sum := self
>>>             inject: sample
>>>             into: [ :accum :each | accum + (aBlock value: each) ].
>>>     ^ sum - sample
>> 
>> 
>> Thanks! Missed that.
>> 
>>> 
>>> On Sun, Dec 20, 2015 at 8:59 AM, Max Leske <maxle...@gmail.com> wrote:
>>> I would like to wrap up this discussion. 
>>> 
>>> 
>>>> On 05 Dec 2015, at 18:14, stepharo <steph...@free.fr> wrote:
>>>> 
>>>> So what is the conclusion?
>>>> I like the idea of Esteban M to have iterator because it moves some 
>>>> behavior out of core classes.
>>>> 
>>>> [[[
>>>> 
>>>> aCollection arithmetic sum: [...] or.... aCollection
>>>> arithmetic avg.
>>>> 
>>>> ]]]
>>>> 
>>> 
>>> While I think that iterators are an intriguing idea I also believe that 
>>> they are beyond the scope of this issue. If anybody wants to follow up on 
>>> iterators (or unit types for that matter) please start a new thread / issue.
>>> 
>>> 
>>> I propose to use Sven’s version for #sum:ifEmpty:. The result would be 
>>> these three methods:
>>> 
>>> sum
>>>     ^ self
>>>             sum: [ :each | each ]
>>>             ifEmpty: [ 0 ]
>>> 
>>> sum: aBlock
>>>     ^ self
>>>             sum: aBlock
>>>             ifEmpty: [ self errorEmptyCollection ]
>>> 
>>> sum: aBlock ifEmpty: emptyBlock
>>>     | sum sample |
>>>     self isEmpty ifTrue: [ ^ emptyBlock value ].
>>>     sample := self anyOne.
>>>     sum := self
>>>             inject: sample
>>>             into: [ :accum :each | accum + (aBlock value: each) ].
>>>     ^ sum - sample
>>> 
>>> 
>>> I’ve attached a couple of benchmark results below. To me they show that
>>> 1. the new implementation is maybe a tiny bit slower but insignificantly so 
>>> (if you’re going for performance you’ll probably write your own optimised 
>>> version anyway)
>>> 2. there is no need to duplicate the code (like #sum and #sum: currently 
>>> do). It’s perfectly fine to delegate to #sum:ifEmpty:
>>> 
>>> 
>>> 
>>> In addition to the above changes I would like to remove #detectSum: (-> 
>>> #sum:) and #sumNumbers (-> #sum).
>>> 
>>> 
>>> Note that once we agree on changing this API, we will need to also change 
>>> #detectMin:, #detectMax:, #min, #max as well as all overrides (e.g. 
>>> RunArray, Interval) of these and of #sum et. al. to stay consistent. The 
>>> changes would of course be in line with this change, such that every 
>>> operation has a unary selector with a sensible default, one that takes a 
>>> block and throws an error for empty collections and a third that takes a 
>>> block for the iteration and one for the empty case.
>>> 
>>> 
>>> Please cast your vote for these changes:
>>> 
>>> 1. Do you agree to changing #sum and #sum: in the suggested way?
>>> 
>>> 2. Do you agree to the removal of #detectSum:?
>>> 
>>> 3. Do you agree to the removal of #sumNumbers?
>>> 
>>> 4. Do you agree that the #max and #min selectors also need to be adapted?
>>> 
>>> 
>>> 
>>> Thanks for you help.
>>> 
>>> Cheers,
>>> Max
>>> 
>>> 
>>> 
>>> 
>>> 
>>> Benchmarks
>>> ============
>>> (Note that these aren’t very good benchmarks. There’s quite some variation 
>>> on each run.)
>>> 
>>> 
>>> Machine:
>>>     MacBook Pro (15-inch, Early 2011)
>>>     CPU: 2.2 GHz Intel Core i7
>>>     Memory: 8 GB 1333 MHz DDR3
>>>     Disk: APPLE SSD TS512C (500 GB)
>>> 
>>> 
>>> Benchmarks of the current versions:
>>> 
>>> [ (1 to: 1000000) asArray sum ] benchFor: 10 seconds.
>>>     75 iterations, 7.470 per second
>>> 
>>> [ (1 to: 1000000) asArray sum: [ :e | e ] ] benchFor: 10 seconds.
>>>     72 iterations, 7.128 per second
>>> 
>>> 
>>> [ (1 to: 100) asArray sum ] benchFor: 10 seconds.
>>>     1,189,477 iterations, 118,912 per second
>>> 
>>> 
>>> [ (1 to: 100) asArray sum: [ :e | e ] ] benchFor: 10 seconds.
>>>     1,171,467 iterations, 117,112 per second
>>> 
>>> 
>>> 
>>> Benchmarks of the new versions:
>>> 
>>> [ (1 to: 1000000) asArray sum ] benchFor: 10 seconds.
>>>     73 iterations, 7.244 per second
>>> 
>>> [ (1 to: 1000000) asArray sum: [ :e | e ] ] benchFor: 10 seconds.
>>>     75 iterations, 7.480 per second
>>> 
>>> [ (1 to: 1000000) asArray sum: [ :e | e ] ifEmpty: [ 0 ] ] benchFor: 10 
>>> seconds.
>>>     72 iterations, 7.141 per second
>>> 
>>> 
>>> [ (1 to: 100) asArray sum ] benchFor: 10 seconds.
>>>     1,115,827 iterations, 111,560 per second
>>> 
>>> [ (1 to: 100) asArray sum: [ :e | e ] ] benchFor: 10 seconds.
>>>     1,154,595 iterations, 115,425 per second
>>> 
>>> [ (1 to: 100) asArray sum: [ :e | e ] ifEmpty: [ 0 ] ] benchFor: 10 seconds.
>>>     1,102,358 iterations, 110,203 per second
> 
> --
> www.tudorgirba.com
> www.feenk.com
> 
> "There are no old things, there are only old ways of looking at them."
> 
> 
> 
> 
> 


Reply via email to