collection>>sum:

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

collection>>sum:

Tudor Girba-2
Hi,

Pharo 2.0 comes with Collection>>sum:

Collection>>sum: aBlock
        "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 := aBlock value: self anyOne.
        sum := self inject: sample into: [ :previousValue :each |  previousValue + (aBlock value: each) ].
        ^ sum - sample

To some extent, this is more generic than the one we had in Moose that considered only numbers:
Collection>>sum: aSymbolOrBlock
        ^ self
                inject: 0
                into: [:sum :each | sum + (aSymbolOrBlock value: each)]


However, with the Pharo 2.0 implementation the collection must not be empty, while the other implementation we get 0. If the collection is empty, you get an exception due to anyOne.

This induced several errors in metric computations (like number of methods of a package when the package had no classes). These are now fixed, but I thought I would let you know just in case you want to rely on this method.

I actually still believe we would benefit from a robust but more limited sum:. Perhaps we could have sumNumbers:.

Cheers,
Doru


--
www.tudorgirba.com

"If you can't say why something is relevant,
it probably isn't."


_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
Reply | Threaded
Open this post in threaded view
|

Re: collection>>sum:

abergel
Thanks for letting us know. I cannot see a case where having 0 as the initial value does not work as expected.

Cheers,
Alexandre


Le 21 avr. 2013 à 17:35, Tudor Girba <[hidden email]> a écrit :

> Hi,
>
> Pharo 2.0 comes with Collection>>sum:
>
> Collection>>sum: aBlock
>    "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 := aBlock value: self anyOne.
>    sum := self inject: sample into: [ :previousValue :each |  previousValue + (aBlock value: each) ].
>    ^ sum - sample
>
> To some extent, this is more generic than the one we had in Moose that considered only numbers:
> Collection>>sum: aSymbolOrBlock
>    ^ self
>        inject: 0
>        into: [:sum :each | sum + (aSymbolOrBlock value: each)]
>
>
> However, with the Pharo 2.0 implementation the collection must not be empty, while the other implementation we get 0. If the collection is empty, you get an exception due to anyOne.
>
> This induced several errors in metric computations (like number of methods of a package when the package had no classes). These are now fixed, but I thought I would let you know just in case you want to rely on this method.
>
> I actually still believe we would benefit from a robust but more limited sum:. Perhaps we could have sumNumbers:.
>
> Cheers,
> Doru
>
>
> --
> www.tudorgirba.com
>
> "If you can't say why something is relevant,
> it probably isn't."
>
>
> _______________________________________________
> Moose-dev mailing list
> [hidden email]
> https://www.iam.unibe.ch/mailman/listinfo/moose-dev

_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
Reply | Threaded
Open this post in threaded view
|

Re: collection>>sum:

stephane ducasse
In reply to this post by Tudor Girba-2
Doru may be we should discuss it in the pharo mailing-list because I found not really good that the sum does not work on empty collection.
On Apr 21, 2013, at 11:35 PM, Tudor Girba <[hidden email]> wrote:

> Hi,
>
> Pharo 2.0 comes with Collection>>sum:
>
> Collection>>sum: aBlock
> "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 := aBlock value: self anyOne.
> sum := self inject: sample into: [ :previousValue :each |  previousValue + (aBlock value: each) ].
> ^ sum - sample
>
> To some extent, this is more generic than the one we had in Moose that considered only numbers:
> Collection>>sum: aSymbolOrBlock
> ^ self
> inject: 0
> into: [:sum :each | sum + (aSymbolOrBlock value: each)]
>
>
> However, with the Pharo 2.0 implementation the collection must not be empty, while the other implementation we get 0. If the collection is empty, you get an exception due to anyOne.
>
> This induced several errors in metric computations (like number of methods of a package when the package had no classes). These are now fixed, but I thought I would let you know just in case you want to rely on this method.
>
> I actually still believe we would benefit from a robust but more limited sum:. Perhaps we could have sumNumbers:.
>
> Cheers,
> Doru
>
>
> --
> www.tudorgirba.com
>
> "If you can't say why something is relevant,
> it probably isn't."
>
>
> _______________________________________________
> Moose-dev mailing list
> [hidden email]
> https://www.iam.unibe.ch/mailman/listinfo/moose-dev


_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
Reply | Threaded
Open this post in threaded view
|

Re: collection>>sum:

Guillaume Larcheveque
In reply to this post by abergel
For example, in Artefact we use Units and I have tried to use sum but it doesn't works because Units doesn't allow to do 0 + 4 cm which is inconsistent.


2013/4/22 Alexandre Bergel <[hidden email]>
Thanks for letting us know. I cannot see a case where having 0 as the initial value does not work as expected.

Cheers,
Alexandre


Le 21 avr. 2013 à 17:35, Tudor Girba <[hidden email]> a écrit :

> Hi,
>
> Pharo 2.0 comes with Collection>>sum:
>
> Collection>>sum: aBlock
>    "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 := aBlock value: self anyOne.
>    sum := self inject: sample into: [ :previousValue :each |  previousValue + (aBlock value: each) ].
>    ^ sum - sample
>
> To some extent, this is more generic than the one we had in Moose that considered only numbers:
> Collection>>sum: aSymbolOrBlock
>    ^ self
>        inject: 0
>        into: [:sum :each | sum + (aSymbolOrBlock value: each)]
>
>
> However, with the Pharo 2.0 implementation the collection must not be empty, while the other implementation we get 0. If the collection is empty, you get an exception due to anyOne.
>
> This induced several errors in metric computations (like number of methods of a package when the package had no classes). These are now fixed, but I thought I would let you know just in case you want to rely on this method.
>
> I actually still believe we would benefit from a robust but more limited sum:. Perhaps we could have sumNumbers:.
>
> Cheers,
> Doru
>
>
> --
> www.tudorgirba.com
>
> "If you can't say why something is relevant,
> it probably isn't."
>
>
> _______________________________________________
> Moose-dev mailing list
> [hidden email]
> https://www.iam.unibe.ch/mailman/listinfo/moose-dev

_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev



--
Guillaume Larcheveque


_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
Reply | Threaded
Open this post in threaded view
|

Re: collection>>sum:

Tudor Girba-2
Hi,

I am CC-ing the pharo mailing list because it can be of interest.

I agree with Guillaume that there is a legitimate need for a generic solution. However, at the same time we lose the convenience of simply adding numbers, which is likely to be the most encountered use case.

I see a couple of possibilities:
- add Collection>>sum: aBlock from: aZeroValue that takes aZeroValue as the default.
- add Collection>>sumNumbers: aBlock that takes 0 as default rather than anyOne.

What do you think?

Cheers,
Doru



On Mon, Apr 22, 2013 at 10:14 AM, Guillaume Larcheveque <[hidden email]> wrote:
For example, in Artefact we use Units and I have tried to use sum but it doesn't works because Units doesn't allow to do 0 + 4 cm which is inconsistent.


2013/4/22 Alexandre Bergel <[hidden email]>
Thanks for letting us know. I cannot see a case where having 0 as the initial value does not work as expected.

Cheers,
Alexandre


Le 21 avr. 2013 à 17:35, Tudor Girba <[hidden email]> a écrit :

> Hi,
>
> Pharo 2.0 comes with Collection>>sum:
>
> Collection>>sum: aBlock
>    "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 := aBlock value: self anyOne.
>    sum := self inject: sample into: [ :previousValue :each |  previousValue + (aBlock value: each) ].
>    ^ sum - sample
>
> To some extent, this is more generic than the one we had in Moose that considered only numbers:
> Collection>>sum: aSymbolOrBlock
>    ^ self
>        inject: 0
>        into: [:sum :each | sum + (aSymbolOrBlock value: each)]
>
>
> However, with the Pharo 2.0 implementation the collection must not be empty, while the other implementation we get 0. If the collection is empty, you get an exception due to anyOne.
>
> This induced several errors in metric computations (like number of methods of a package when the package had no classes). These are now fixed, but I thought I would let you know just in case you want to rely on this method.
>
> I actually still believe we would benefit from a robust but more limited sum:. Perhaps we could have sumNumbers:.
>
> Cheers,
> Doru
>
>
> --
> www.tudorgirba.com
>
> "If you can't say why something is relevant,
> it probably isn't."
>
>
> _______________________________________________
> Moose-dev mailing list
> [hidden email]
> https://www.iam.unibe.ch/mailman/listinfo/moose-dev

_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev



--
Guillaume Larcheveque


_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev




--

"Every thing has its own flow"

_______________________________________________
Moose-dev mailing list
[hidden email]
https://www.iam.unibe.ch/mailman/listinfo/moose-dev