[squeak-dev] Re: What is equivalence? (was: The Trunk: Collections-eem.603.mcz)

Chris Muller ma.chris.m at gmail.com
Thu Feb 5 00:49:20 UTC 2015

>> >> If #isDictionary refers to particular API and behaviors, one could
>> >> argue that a BTree should answer true to #isDictionary, because it has
>> >> similar API and behaviors.  In the context of _equivalence testing_
>> >> though, a BTree is not a Dictionary.
>> >>
>> >> So as long as we interpret the various #isSomeType methods as truly of
>> >> *that type* (same semantics as isKindOf:), and not "similar to", then
>> >> I can see no side-effects (unless someone added #isDictionary to
>> >> BTree, of course).  However, we may want to visit the other #=
>> >> implementations elsewhere in the system too, unless this would appear
>> >> to be an inconsistency producing its own odor of sorts.
>> >
>> > "similar to" is vague.  I *don't* interpret isFoo methods as isKindOf:
>> > (and
>> > think that most experienced Smalltalk programmers don't either).
>> > In
>> > Smalltalk type = protocol.  So these methods imply that an object
>> > implements
>> > a given set of messages, not that they are of any given class.
>> Then I am very interested to know your thoughts about my BTree
>> question, above, which shares the same protocol as Dictionary.  Should
>>     (BTree new at: 3 put: 'three'; yourself) = (Dictionary new at: 3
>> put: 'three'; yourself)
>> return true?  Why or why not?
> Duck typing applies here, if it quacks like a duck.  So if your BTree
> behaves like a Dictionary to the extent that e.g. MethodDictionary does
> (MethodDictionary supports associationAt: but isn't answering an association
> within it cuz it does't contain associations) then sure, it's a Dictionary.

I do not wish to be argumentative, but does a WeakArray quack like an
Array?  Not only does WeakArray share exactly the same API, but even
inherits from Array and "is-a" Array.  So why shouldn't this be true?

    (Array with: 1 with: 2 with: 3) = (WeakArray with: 1 with: 2 with:
3)   "false"

I think the answer is because #= (not any other method, just #=) needs
to care about which _implementation_ of the argument which is passed
when considering true equivalence to another object.

I agree we human developers can consider unequal but same-quacking
objects interchangeable in our fuzzy minds when we design our
applications, and that is powerful, however, *within the system*, I
just it needs #= to make implementation-specific distinctions,
especially for as base-classes as Array and Dictionary.

This seems to be reflected by most of the #= implementations in the
system, which check either #class, #species, or #isKindOf:.

More information about the Squeak-dev mailing list