[Cuis-dev] Inconsistent #= and #hash

Juan Vuletich juan at jvuletich.org
Tue Jun 11 10:25:02 PDT 2019


On 6/11/2019 8:49 AM, Luciano Notarfrancesco via Cuis-dev wrote:
> I did this to fish for inconsistencies:
>
> instances _ OrderedCollection new.
> Object withAllSubclassesDo: [:each| instances addAll: each allInstances].
> instances _ instances asArray.
>
> 1 to: instances size do: [:i|
>     a _ instances at: i.
>     aHash _ a hash.
>     i+1 to: instances size do: [:j|
>         b _ instances at: j.
>         (a = b and: [(aHash = b hash and: [b = a]) not]) ifTrue: [self 
> halt]]]
>
> (I typed it manually here, I hope I copied it right, but you get the 
> idea.)
>
> Found out this:
> - FeatureRequest forgets to implement hash;
> - #() = Semaphore new, but not the other way around, and hashes also 
> differ;
> - similarly, LinkedList new = Semaphore new;
> - RunArray new = Object new fails because it assumes the argument is a 
> Collection and sends isSequenceable;
> - RunArray new = Text new, but hashes differ;
> - Set new = Dictionary new but hashes differ;
>
> And there are more, I stopped before finishing.
>
> I don't know how to fix some of those, and the implications of 
> changing the behavior of #= or #hash are not obvious in some cases. 
> But I think we should change Collection>>hash to set the initial value 
> to 0 instead of 'self species hash', and that would fix two of the 
> issues above. What do you think? Other ideas?

I just pushed fixes to most of them. For Semaphore and RunArray it is a 
matter of implementing and honoring #species. For Set, it was making 
aDictionary is: #Set to answer false. For the others it was adding a new 
#hash or #= methods. I don't expect much breakeage.

I'll run now a tweaked (hopefully faster) version of your script.

Cheers,

-- 
Juan Vuletich
www.cuis-smalltalk.org
https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
https://github.com/jvuletich
https://www.linkedin.com/in/juan-vuletich-75611b3
@JuanVuletich



More information about the Cuis-dev mailing list