[BUG][FIX] WeakKeyDictionary>>keysAndValuesDo:

Martin Wirblat sql.mawi at t-link.de
Tue Jun 15 08:29:09 UTC 2004


"Richard A. O'Keefe" wrote:
>Remember the fundamental rule about #hash:
>
>    x = y implies: x hash = y hash
>

....

>Now, suppose we have two different Set objects x, y, which have the
>same elements:
>
>    x := #(1 2 3 4) asSet.
>    y := #(3 1 4 2 4 1 3) asSet.
>
>We expect that x = y.  After all, two sets are equal if and only if 
>they have equal elements, and if Sets don't act like sets, they have 
>no right to the name.  If we *ever* hope to use Sets as elements of 
>other Sets or as keys in a Dictionary, they had *better* get equality 
>right.
>
I guess you are referring with "the name" to how mathematicians have 
defined their Sets. They have platonic Sets, meaning = and == are not 
distinguished. Here on earth representation or materialization 
matters, so programmers can have different sets with the same contents.
 

Programmers' Sets are different from mathematicians'. A mathematician 
can't add something to a set without getting another set. After 
adding something to a set a programmer has of course the same object 
and that may lead him to think that he has the same set. 

.....

>	For me it is totally nonintuitive not to be able 
>	to put any Set into another one.
>
>No, you've got it wrong.  What I said was that you cannot put a Set
>object inside ITSELF.  You can put a Set inside a DIFFERENT set with
>no trouble at all.  In fact, from what you have said, out of Ambrai,
>Dolphin, VSE, VW, and Squeak, Squeak is the *only* one where you *can*
>usefully put a Set inside another Set.
>
I know what you said. But you are implying that a set is the Set of 
the mathematicians. Only then you can put a set into another set. Such 
a Set must not be changed, which contradicts to the programmer's day 
to day use of Set. 
>
>	In fact every object that is explicitly designed to change its
>	contents but which is not maintaining its hash value will give
>	the programmer no intuitive clue that it can't be put in a Set.
>	
>I am always suspicious of appeals to 'intuition'.  One can reasonably
>expect a Smalltalk programmer to know the two fundamental rules of 
>hashing: 
>
>(1) x = y implies: x hash = y hash
>(2) A mutable object should not be mutated while its hash value is 
>useful, 
>    that is, while it is a member of a set or bag or a key in a 
>    dictionary. 
>
That may be clear to you, but I bet that many if not most people who 
are programming Smalltalk (i.e. including many newcomers) are not 
aware of this problem, which is pretty good demonstrated by the fact 
that different Smalltalk dialects implement Sets differently (and only 
Squeak gets it right in your opinion). 

After all one criterion for the quality of a programming language is 
how intuitive it is. A Set and even more a Bag is a brown sack for me. 
I stuff things in it and from time to time I ask if something specific 
is in it. I would be astonished when I order to put something new into 
the sack and it vanishes from the cellar of my warehouse and pops up 
in the loft. 

Arrays and Strings can be created literally and can not change size. 
There is a difference to Sets and that's what I wanted to express with 
"explicitly designed to change". Arrays and Strings are more alike the 
mathematician's Set than the programmer's Set is. 

A Squeak Set implements the mathematician's equality for #=. My brown 
sack would be better suited with implementing identity for #= and 
#hash accordingly and an additional #equals: would serve the 
mathematicians. Perhaps the question is, if the average programmer is 
more a mathematician or a warehouse worker? 

regards
Martin




More information about the Squeak-dev mailing list