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

Chris Muller asqueaker at gmail.com
Thu Jun 15 20:52:41 UTC 2017


^ self select: [ : each | seen addNew: each ]

?


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