On Saturday, October 22, 2011 4:31:29 PM UTC-4, Luc wrote:
>
> Where's the contract breach here ?
>
Glad you asked. Consider the following clojure session (1.3), shortened for 
your reading pleasure:

map-1  =>  {-1 :yo}
map-2  =>  {-1 :yo}
key-1  =>  -1
key-2  =>  -1

Just some simple maps and values, right?

(= map-1 map-2)  =>  true
(= key-1 key-1 -1)  =>  true

Yup, they're the same. But:

(map-1 key-1)  =>  :yo
(map-2 key-1)  =>  :yo
(map-1 key-2)  =>  :yo
(map-2 key-2)  =>  nil

Oops! Despite being "equal", the two maps behave differently. Why? 

(class map-1)  =>  clojure.lang.PersistentArrayMap
(class map-2)  =>  clojure.lang.PersistentHashMap
(class key-1)  =>  java.lang.Integer
(class key-2)  =>  java.lang.Long

Unless I am mistaken, the difference between an ArrayMap and a HashMap is 
supposed to be an implementation detail - an optimization. I'm sure that 
they shouldn't have different semantics. But when hashCodes and equality do 
not agree, this is the sort of thing that can happen.

Note that I'm not claiming to have any deep insights into what's broken and 
what's not, either in Clojure or in Java. All I'm saying is that claiming 
anything along the lines of "Clojure is not Java, so we can do whatever we 
want - contracts do not apply" does not lead to sane map behavior. Those 
contracts were created for a reason.

To be honest, I've sort-of lost the plot of how this is related to the 
boxing-ints-as-Longs issue, but that's probably due to both my lack of 
expertise in this area and to the generous glass of whiskey I had while 
watching Megamind with my kids this afternoon. But I digress. The point I 
think I was trying to back up is "if clojure changes equality semantics, it 
should change hashcodes to match". That sounds right to me.

- Chris
 

-- 
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