[squeak-dev] The Trunk: Collections-eem.756.mcz

Chris Muller asqueaker at gmail.com
Thu Jun 15 21:29:31 UTC 2017


You may also expect it to not to be identical to #add:.


On Thu, Jun 15, 2017 at 4:03 PM, Tobias Pape <Das.Linux at gmx.de> wrote:
>
>> On 15.06.2017, at 22:52, Chris Muller <asqueaker at gmail.com> wrote:
>>
>> ^ self select: [ : each | seen addNew: each ]
>
> I would expect that to return each not true/false…
>>
>> ?
>>
>>
>> On Thu, Jun 15, 2017 at 3:50 PM, Chris Cunningham
>> <cunningham.cb at gmail.com> wrote:
>>>
>>>
>>> On Thu, Jun 15, 2017 at 1:22 PM, Tobias Pape <Das.Linux at gmx.de> wrote:
>>>>
>>>>
>>>>> On 15.06.2017, at 21:40, Eliot Miranda <eliot.miranda at gmail.com> wrote:
>>>>>
>>>>> Hi Tobias,
>>>>>
>>>>> On Thu, Jun 15, 2017 at 12:32 PM, Tobias Pape <Das.Linux at gmx.de> wrote:
>>>>>
>>>>>> On 15.06.2017, at 21:22, Chris Cunningham <cunningham.cb at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>> #testMissingThenAdd:  ?
>>>>>>
>>>>>
>>>>> #isAdding:
>>>>> #ingests:
>>>>>
>>>>> #wasAbsentButNowIsPresent:
>>>>>
>>>>> (just rambling…)
>>>>>
>>>>> I like added:.  Its concise, accurate and reads nicely:
>>>>
>>>>
>>>> Ok, but then maybe #addedNew: ? So as we know more than just an adding
>>>> operation succeeded… :)
>>>
>>>
>>> So it reads:
>>>
>>> ^self select: [:each| seen addedNew: each]
>>>
>>> I like that how that reads.
>>>
>>> #added: wasn't bad - but I could see myself thinking it meant roughly 'was
>>> this value already in the collection'?  Which misses the add part and is
>>> backwards on the result (true if present, false if added).
>>>
>>> -cbc
>>>>
>>>>
>>>>>
>>>>> withoutDuplicates
>>>>>      "Answer a copy of the receiver that preserves order but eliminates
>>>>> any duplicates."
>>>>>      | seen |
>>>>>      seen := Set new: self size.
>>>>>      ^self select: [:each| seen added: each]
>>>>>
>>>>> messagesDo: aBlock
>>>>>      "Evaluate aBlock exactly once with all the message selectors sent
>>>>> by me."
>>>>>
>>>>>      | scanner aSet |
>>>>>      self isQuick ifTrue: [ ^self ].
>>>>>      scanner := InstructionStream on: self.
>>>>>      scanner scanFor: [ :x |
>>>>>              | selector |
>>>>>              (selector := scanner selectorToSendOrSelf) == scanner
>>>>> ifFalse: [
>>>>>                      ((aSet ifNil: [ aSet := IdentitySet new ]) added:
>>>>> selector) ifTrue: [
>>>>>                              aBlock value: selector ] ].
>>>>>              false "keep scanning" ]
>>>>>
>>>>>
>>>>>
>>>>>> On Jun 15, 2017 12:19 PM, "Eliot Miranda" <eliot.miranda at gmail.com>
>>>>>> wrote:
>>>>>> Hi Tobias,
>>>>>>
>>>>>> On Thu, Jun 15, 2017 at 12:06 PM, Tobias Pape <Das.Linux at gmx.de>
>>>>>> wrote:
>>>>>>
>>>>>>> On 15.06.2017, at 20:30, Eliot Miranda <eliot.miranda at gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>> Hi Levente, Hi Chris,
>>>>>>>
>>>>>>> On Wed, Jun 14, 2017 at 1:10 PM, Levente Uzonyi
>>>>>>> <leves at caesar.elte.hu> wrote:
>>>>>>> On Wed, 14 Jun 2017, commits at source.squeak.org wrote:
>>>>>>>
>>>>>>> Eliot Miranda uploaded a new version of Collections to project The
>>>>>>> Trunk:
>>>>>>> http://source.squeak.org/trunk/Collections-eem.756.mcz
>>>>>>>
>>>>>>> ==================== Summary ====================
>>>>>>>
>>>>>>> Name: Collections-eem.756
>>>>>>> Author: eem
>>>>>>> Time: 14 June 2017, 11:03:24.917631 am
>>>>>>> UUID: 8d7c03bc-1cdb-44c7-9173-10d50c0dae29
>>>>>>> Ancestors: Collections-eem.755
>>>>>>>
>>>>>>> Add SequenceableCollection>>withoutDuplicates for a more elegant fix
>>>>>>> to MailMessage>>to:
>>>>>>>
>>>>>>> =============== Diff against Collections-eem.755 ===============
>>>>>>>
>>>>>>> Item was added:
>>>>>>> + ----- Method: SequenceableCollection>>withoutDuplicates (in
>>>>>>> category 'copying') -----
>>>>>>> + withoutDuplicates
>>>>>>> +       "Answer a copy of the receiver that preserves order but
>>>>>>> eliminates any duplicates."
>>>>>>> +       | seen |
>>>>>>> +       seen := Set new: self size.
>>>>>>> +       ^self select: [:each|
>>>>>>> +                                 (seen includes: each)
>>>>>>> +                                       ifTrue: [false]
>>>>>>> +                                       ifFalse: [seen add: each.
>>>>>>> true]]!
>>>>>>>
>>>>>>> What a great opportunity to use #addNewElement::
>>>>>>>
>>>>>>>        ^self select: [ :each | seen addNewElement: each ]
>>>>>>>
>>>>>>> I love the functionality but I don't like the selector. It seems to
>>>>>>> imply that one must only add a new element.  So why not call this something
>>>>>>> like addIfAbsent: ?
>>>>>>>
>>>>>>> Here are some suggestions.  Votes?
>>>>>>> - don't change it; stick with addNewElement:
>>>>>>> - addIfAbsent:
>>>>>>> - ifAbsentAdd:
>>>>>>> - ifMissingAdd:
>>>>>>>
>>>>>>> I think I prefer ifAbsentAdd: cuz addIfAbsent: looks too much like a
>>>>>>> potential spelling error, and conflicts with typical ifAbsent: arguments
>>>>>>> supplying exception blocks.  But I could go with ifMissingAdd: because it is
>>>>>>> more distinctive.
>>>>>>
>>>>>> Well, we do have
>>>>>>
>>>>>>        Collection>>addIfNotPresent:
>>>>>>
>>>>>> So why invent a new one?
>>>>>>
>>>>>> Because addIfNotPresent: answers its argument and we need one that
>>>>>> answers whether the element was absent.  So alas addIfNotPresent: is not a
>>>>>> suitable candidate.
>>>>>>
>>>>>>
>>>>>> I think the important thing with #addNewElement: is that it returns
>>>>>> *whether* it added a new element
>>>>>> but then again it breaks the tradition of #add* returning its
>>>>>> argument…
>>>>>>
>>>>>> a very clear and very strange one that would reveal that a boolean is
>>>>>> returned would be #isAbsentAndIfSoAdd: …
>>>>>>
>>>>>> wasAbsentAdding: or ifWasAbsentAdding: would be less cumbersome but I
>>>>>> like something snappier that people will remember.  ifMissingAdd: looks good
>>>>>> because it doesn't conflict with the add*: methods answering their argument,
>>>>>> and the ifMissing implies the answer is true if the element wasn't already
>>>>>> present.
>>>>>>
>>>>>> Stéphane, can you live with ifMissingAdd: ?  Chris?
>>>>>>
>>>>>> Best regards
>>>>>>        -Tobias
>>>>>>
>>>>>>> _,,,^..^,,,_
>>>>>>> best, Eliot
>>>>>>
>>>>>> _,,,^..^,,,_
>>>>>> best, Eliot
>>>>>
>>>>> _,,,^..^,,,_
>>>>> best, Eliot
>>>>>
>>>>
>>>>
>>>
>>>
>>>
>>>
>>
>
>


More information about the Squeak-dev mailing list