The crux of the issue:

user> (= (long 1) (int 1))
true
user> (.equals (long 1) (int 1))
false
user> (.equals (int 1) 1)
true
user> (.equals (long 1) 1)
false

So, as you can see, small integer literals are Integers by default in
Clojure.  And, while Integers and Longs with the same value are
Clojure "=", they are not ".equal" to each other in Java-land.

Now, since Clojure's maps implement java.util.Map, they're supposed to
use java's .equals. (They must do so to use existing .hashCode methods
on Java objects).  So, you get:

user> ({ (long 1) :found} (long 1))
:found
user> ({ (long 1) :found} 1)
nil

(If you want to lookup from your map with Long keys, you better make
sure the lookup keys are Longs too).  Be careful to keep these
straight, a map can have distinct k-v pairs for different numeric key
types:

user> ({ (long 1) :found-a-long (int 1) :found-an-int} 1)
:found-an-int

Finally, the situation with sorted-map is a bit strange.  For example,
see the third paragraph of:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeMap.html

Now, Clojure's default comparator considers (long 1) and (int 1) to be
equal (see "(doc compare)"):

user> (compare (long 1) (int 1))
0

and so by default sorted-map does too.  Note that the caveats
mentioned in the above webpage apply; technically, sorted-map with the
default comparator does not correctly implement the java.util.Map
interface, although in practice this may lead to more sensible-seeming
behavior.

Hopefully this helps, and I haven't misunderstood/misprepresented what
Clojure does here...

-Jason

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to