On Mar 30, 2009, at 12:36, Mark Engelberg wrote:
> I'm aware that a and 123 have different types, but I was under the
> impression that the hash set implementation was supposed to just rely
> on hash codes and equality. Why does the type come into play, and is
> this really the desired behavior?
It looks like a bug to me, for the reasons you mention.
BTW, hash sets are implemented in terms of hash maps, which show the
same behaviour:
(def a (BigInteger. "123"))
({a :found} 123)
returns nil.
Looking at the implementation of PersistentHashMap, I note that the
ultimate key equality test is (line 560):
public LeafNode find(int hash, Object key){
if(hash == this.hash && Util.equals(key, this.key))
return this;
return null;
}
The test applied is Util.equals, so let's try that:
(. clojure.lang.Util equals a 123)
This returns false, unlike
(. clojure.lang.Util equiv a 123)
which returns true. clojure.core/= calls equiv, which is why (= a
123) is true. equiv is the same as equals EXCEPT for numbers and
Clojure collections, so perhaps sets and maps also have some surprise
behaviour for collections.
I don't know if there is a good reason for using equals rather than
equiv in testing for key equality in maps. Using equiv would better
agree with my expectations.
Konrad.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---