Hi all,

(This might have been asked before, but I couldn't find anything through a 
search in the group history or google.)

First of all, Clojure/ClojureScript are awesome!

I found the result of comparing a map and a record is different based on the 
order of the arguments to =:

To quit, type: :cljs/quit
cljs.user=> (defrecord R [])
cljs.user/R
cljs.user=> (= {} (R.))
true
cljs.user=> (= (R.) {})
false

I tried the code above with tags r1.7.228, r1.8.34 and 1.9.293.

Is this expected behavior?

This seems to be rooted in the fact that when a map is the first argument the 
function used to make the comparison is the implementation of "equiv" from the 
map. But when a record is the first argument the implementation used is the one 
from the record, which checks if the types of both arguments are equal.

The behavior is Clojure (JVM) is consistent:

user=> (defrecord R [])
user.R
user=> (= {} (R.))
true
user=> (= (R.) {})
false

I suspect this works consistenly since the implementation of "equiv" in 
"clojure.lang.APersistentMap" checks for the marker interface "MapEquivalence".

Kind regards,
Juan

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/clojurescript.

Reply via email to