On a more general note, what do you think of how it's done in other languages (Haskell's "Maybe") ?We already have it in the form of nil / all other objects and #ifNil:, but that would make it explicit with a couple of classes:Maybe subclass: ActualValueMaybe subclass: MissingValueand a #default: or #orElse: accessor to get the wrapped value, defaulting to something else, or some block-evaluating message similar to #ifNotNilDo:On 21 December 2016 at 12:05, Tudor Girba <tudor@tudorgirba.com> wrote:Hi,
I forgot to mention that another option I played with was to always use a metric object, and never numbers. So, numberOfLinesOfCode would return a MetricValue. I think the same idea is present in acqoncagua.
Cheers,
Doru
--
www.tudorgirba.com
"Every thing has its own flow"
> On 21 Dec 2016, at 08:21, Tudor Girba <tudor@tudorgirba.com> wrote:
>
> Hi Alex,
>
> Following the design proposed by Stef, in your case you would use a different collection.
>
> Cheers,
> Doru
>
>
>> On Dec 21, 2016, at 8:13 AM, Alexandre Bergel <alexandre.bergel@me.com> wrote:
>>
>> Hi Stef,
>>
>> You are raising an interesting point to discuss. This MissingValue is indeed better than having -1
>> Something to keep in mind: it may be that one would like to focus on the missing value and not really the value.
>>
>> Consider:
>>
>>> testCollect
>>>
>>> | uarray collected |
>>> uarray := UniformOrderedCollection new.
>>> uarray add: 10.
>>> uarray add: 20.
>>> uarray add: (MissingValue discarding).
>>> collected := uarray collect: [ :each | each ].
>>> self assert: collected size equals: 2.
>>
>> It could well be that I would like to be able to query over the MissingValue.
>> Can something like possible: uarray collect: #isMissing
>> ?
>>
>> Cheers,
>> Alexandre
>>
>>
>>> On Dec 20, 2016, at 10:15 PM, stepharong <stepharong@free.fr> wrote:
>>>
>>> Hi dear great OO designers
>>>
>>> Here is a little challenges for your brainy souls :)
>>>
>>> In Moose when we compute metrics it may happen than a tool (often external to pharo) does not compute a metrics
>>> and when we request it in moose we check and often we return a not so good -1.
>>>
>>> I'm trying to brainstorm on a solution
>>>
>>> - first may be the simplest way is to not invoke a metrics when it is not computed. But it means that we should know it and that we should have a registration mechanism. After all this is probably the best solution.
>>>
>>> - Second we were thinking to use exception but when we have multiple entities missing one metrics.... I have serious doubts.
>>>
>>> - Second I was thinking about having the following behavior
>>>
>>> testCollect
>>>
>>> | uarray collected |
>>> uarray := UniformOrderedCollection new.
>>> uarray add: 10.
>>> uarray add: 20.
>>> uarray add: (MissingValue discarding).
>>> collected := uarray collect: [ :each | each ].
>>> self assert: collected size equals: 2.
>>>
>>> testDo
>>>
>>> | res uarray |
>>> uarray := UniformOrderedCollection new.
>>> uarray add: 10.
>>> uarray add: 20.
>>> uarray add: (MissingValue discarding).
>>> uarray add: 40.
>>> res := 0.
>>> uarray do: [ :each | res := res + each ].
>>> self assert: res equals: 70.
>>>
>>>
>>> testCollectDefaulting
>>>
>>> | uarray collected |
>>> uarray := UniformOrderedCollection new.
>>> uarray add: 10.
>>> uarray add: 20.
>>> uarray add: (MissingValue default: 33).
>>> collected := uarray collect: [ :each | each ].
>>> self assert: collected size equals: 3.
>>> self assert: collected third equals: 33
>>>
>>>
>>> I basically started to implement
>>>
>>>
>>> do: aBlock
>>> "Refer to the comment in Collection|do:."
>>> 1 to: self size do:
>>> [:index | (self at: index) toDo: aBlock on: self]
>>>
>>>
>>>
>>> collect: aBlock
>>> "Evaluate aBlock with each of the receiver's elements as the argument.
>>> Collect the resulting values into a collection like the receiver. Answer
>>> the new collection."
>>>
>>> | newCollection |
>>> newCollection := self species new.
>>> self
>>> do: [ :each | each toCollect: aBlock on: newCollection ].
>>> ^ newCollection
>>>
>>>
>>> and
>>>
>>> DiscardingValue >> toCollect: aBlock on: aCollection
>>> "discard computation"
>>> ^ self
>>>
>>>
>>> Object >> toCollect: aBlock on: aCollection
>>>
>>> ^ aCollection add: (aBlock value: self)
>>>
>>>
>>> So I imagine that you see the design and I wanted to get your point of view.
>>>
>>> --
>>> Using Opera a kind of bad mail client but far better than thunderbird
>>> _______________________________________________
>>> Moose-dev mailing list
>>> Moose-dev@list.inf.unibe.ch
>>> https://www.list.inf.unibe.ch/listinfo/moose-dev
>>
>> --
>> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
>> Alexandre Bergel http://www.bergel.eu
>> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
>>
>>
>>
>> _______________________________________________
>> Moose-dev mailing list
>> Moose-dev@list.inf.unibe.ch
>> https://www.list.inf.unibe.ch/listinfo/moose-dev
>
> --
> www.tudorgirba.com
> www.feenk.com
>
> "If you interrupt the barber while he is cutting your hair,
> you will end up with a messy haircut."
>
_______________________________________________
Moose-dev mailing list
Moose-dev@list.inf.unibe.ch
https://www.list.inf.unibe.ch/listinfo/moose-dev
--