[squeak-dev] The Trunk: Collections-nice.820.mcz
Levente Uzonyi
leves at caesar.elte.hu
Fri Feb 15 22:53:36 UTC 2019
On Fri, 15 Feb 2019, Chris Muller wrote:
>>> There was another change to earlier today that you may be interested
>> > in asking that question about too, since it changed 19-year old
>> > SequenceableCollection>>#= with a one-day old replacement and actually
>> > went into trunk.
>>
>> Please note that this has been discussed more than a month ago, and the discussion clearly converged to this consensus:
>> - having Interval and Array being = is not an important feature
>> - it seriously impacts efficiency of Interval hash
>> - it causes long standing bugs that we carry for years (19 years or so)
>
> Yes, I remember that discussion.
>
>> What's the point of having Interval = Array, when we have OrderedCollection ~= Array at the same time?
>> A less arbitrary feature would be a generalization of eachOperand isSequenceable ==> testThatElementsAreSameSequence:
>> But it's both too hard to maintain (a bug factory), aand a problem for efficient implementation of some specialized collection.
>> At the end, it's maybe not so much a desirable feature and it's practically not used in trunk images, apart for writing shorter tests.
>> I'm not a big fan of C motto when used with extremism: you don't pay for what you don't buy.
>> But I have the feeling that it makes sense here.
>
> I have no reason to critique this reasoning, I simply did not have
> time to test with it yet. Sometimes testing after tweaks at low
> levels can "reveal" things that weren't thought about before. But
> also, what I really dislike are continued use == on the class test.
What is the use case which doesn't work with the
foo class == bar class ifTrue: [ ... ]
pattern?
Levente
> I'm sorry, but these kinds of hacks are killing Squeak's dynamism by a
> thousand cuts and me along with it. :( Would you **Please
> Delegate** equivalence tests (#=) to the receiver, and let them
> inherit the identity implementation from Object?
>
> - Chris
>
>
> - Chris
>
>> BTW, I don't like hasEqualElements: because I mentally associate elements to Set, and for me #(1 2 3) hasEqualElements: #(3 1 2), just with a different order.
>> I would prefer something like isSameSequenceAs: which clearly tells about the ordering.
>>
>> Le mer. 13 févr. 2019 à 17:21, Chris Cunningham <cunningham.cb at gmail.com> a écrit :
>>>
>>> Thank you. This was an angle I hadn't thought of - but definitely opens up how to fix it correctly:
>>> >Definitively abandon SequenceableCollection equality tests based on equal species.
>>>
>>> On Tue, Feb 12, 2019 at 2:56 PM <commits at source.squeak.org> wrote:
>>>>
>>>> Nicolas Cellier uploaded a new version of Collections to project The Trunk:
>>>> http://source.squeak.org/trunk/Collections-nice.820.mcz
>>>>
>>>> ==================== Summary ====================
>>>>
>>>> Name: Collections-nice.820
>>>> Author: nice
>>>> Time: 12 February 2019, 11:56:35.262017 pm
>>>> UUID: bb383133-067c-4133-987b-c481a7de69c7
>>>> Ancestors: Collections-ul.819, Collections-cbc.813
>>>>
>>>> Definitively abandon SequenceableCollection equality tests based on equal species.
>>>>
>>>> Old behaviour can still be obtained thru hasEqualElements: but the default is to not try to support such trans-class equality feature because it is much too complex.
>>>>
>>>> Particularly Interval are no more equal to Arrays with same sequence. We can thus optimize hash a bit more and fix the old bugs of equa objects with different hashes. Merge Collections-cbc.813 for this and rehashAll in postscript.
>>>>
>>>> There are not so many classes concerned by this change, mainly RunArray, Interval and LinkedList:
>>>>
>>>> Collection withAllSubclasses select: [:e | [e basicNew species ~= e] on: Error do: [false]]
>>>> -> an OrderedCollection(WeakRegistry LinkedList Interval ByteCharacterSet CharacterSetComplement LazyCharacterSet WideCharacterSet ShortRunArray Semaphore Mutex TextLineInterval WeakArray Monitor MCVersionName ByteSymbol WideSymbol)
>>>>
>>>> We will have to change the tests that rely on such equality.
>>>>
>>>> =============== Diff against Collections-ul.819 ===============
>>>>
>>>> Item was changed:
>>>> ----- Method: FloatArray>>= (in category 'comparing') -----
>>>> = aFloatArray
>>>> - | length |
>>>> <primitive: 'primitiveEqual' module: 'FloatArrayPlugin'>
>>>> + ^super = aFloatArray!
>>>> - aFloatArray class = self class ifFalse: [^ false].
>>>> - length := self size.
>>>> - length = aFloatArray size ifFalse: [^ false].
>>>> - 1 to: self size do: [:i | (self at: i)
>>>> - = (aFloatArray at: i) ifFalse: [^ false]].
>>>> - ^ true!
>>>>
>>>> Item was changed:
>>>> ----- Method: Interval>>= (in category 'comparing') -----
>>>> = anObject
>>>> -
>>>> ^ self == anObject
>>>> + or: [anObject isInterval
>>>> + ifFalse: [super = anObject]
>>>> + ifTrue:
>>>> + [start = anObject first
>>>> + and: [step = anObject increment
>>>> + and: [self last = anObject last]]]]!
>>>> - ifTrue: [true]
>>>> - ifFalse: [anObject isInterval
>>>> - ifTrue: [start = anObject first
>>>> - and: [step = anObject increment
>>>> - and: [self last = anObject last]]]
>>>> - ifFalse: [super = anObject]]!
>>>>
>>>> Item was changed:
>>>> ----- Method: Interval>>hash (in category 'comparing') -----
>>>> hash
>>>> "Hash is reimplemented because = is implemented."
>>>> + ^((start hash hashMultiply bitXor: self last hash) hashMultiply
>>>> + bitXor: self size)!
>>>> -
>>>> - ^(((start hash bitShift: 2)
>>>> - bitOr: stop hash)
>>>> - bitShift: 1)
>>>> - bitOr: self size!
>>>>
>>>> Item was changed:
>>>> ----- Method: RunArray>>= (in category 'comparing') -----
>>>> = anObject
>>>> + self == anObject ifTrue: [^ true].
>>>> - "Test if all my elements are equal to those of anObject"
>>>> -
>>>> ^anObject class == self class
>>>> + and:
>>>> - ifTrue: "Faster test between two RunArrays"
>>>> [(runs hasEqualElements: anObject runs)
>>>> + and: [values hasEqualElements: anObject values]]!
>>>> - and: [values hasEqualElements: anObject values]]
>>>> - ifFalse:
>>>> - [anObject isCollection and: [self hasEqualElements: anObject]]!
>>>>
>>>> Item was changed:
>>>> ----- Method: SequenceableCollection>>= (in category 'comparing') -----
>>>> = otherCollection
>>>> "Answer true if the receiver is equivalent to the otherCollection.
>>>> + First test for identity, then rule out different class and sizes of
>>>> - First test for identity, then rule out different species and sizes of
>>>> collections. As a last resort, examine each element of the receiver
>>>> and the otherCollection."
>>>>
>>>> self == otherCollection ifTrue: [^ true].
>>>> + self class == otherCollection class ifFalse: [^ false].
>>>> - self species == otherCollection species ifFalse: [^ false].
>>>> ^ self hasEqualElements: otherCollection!
>>>>
>>>> Item was changed:
>>>> ----- Method: Symbol>>= (in category 'comparing') -----
>>>> = aSymbol
>>>> "Compare the receiver and aSymbol."
>>>> self == aSymbol ifTrue: [^ true].
>>>> + aSymbol isSymbol ifTrue: [^ false].
>>>> - self class == aSymbol class ifTrue: [^ false].
>>>> "Use String comparison otherwise"
>>>> ^ super = aSymbol!
>>>>
>>>> Item was changed:
>>>> + (PackageInfo named: 'Collections') postscript: 'Character initializeClassificationTable.
>>>> + HashedCollection rehashAll.'!
>>>> - (PackageInfo named: 'Collections') postscript: 'Character initializeClassificationTable'!
>>>>
>>>>
>>>
>>
More information about the Squeak-dev
mailing list
|