<div dir="ltr"><div>I did this to fish for inconsistencies:</div><div><br></div><div>instances _ OrderedCollection new.</div><div>Object withAllSubclassesDo: [:each| instances addAll: each allInstances].</div><div>instances _ instances asArray.</div><div><br></div><div>1 to: instances size do: [:i|</div><div>    a _ instances at: i.</div><div>    aHash _ a hash.</div><div>    i+1 to: instances size do: [:j|</div><div>        b _ instances at: j.</div><div>        (a = b and: [(aHash = b hash and: [b = a]) not]) ifTrue: [self halt]]]</div><div><br></div><div>(I typed it manually here, I hope I copied it right, but you get the idea.)</div><div><br></div><div>Found out this:</div><div><div>- FeatureRequest forgets to implement hash;</div>- #() = Semaphore new, but not the other way around, and hashes also differ;</div><div>- similarly, LinkedList new = Semaphore new;</div><div>- RunArray new = Object new fails because it assumes the argument is a Collection and sends isSequenceable;</div><div>- RunArray new = Text new, but hashes differ;<br></div>- Set new = Dictionary new but hashes differ;<div><br></div><div>And there are more, I stopped before finishing.</div><div><br></div>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?<br></div>