Encontré el comportamiento de Clojure confuso en cuanto a la igualdad entre mapas y registros. En este primer ejemplo, tenemos dos tipos diferentes que son estructuralmente iguales. La igualdad = función devuelve verdadero:Igualación de mapas y registros en Clojure
user> (defn make-one-map
[]
{:a "a" :b "b"})
#'user/make-one-map
user> (def m1 (make-one-map))
#'user/m1
user> m1
{:a "a", :b "b"}
user> (def m2 {:a "a" :b "b"})
#'user/m2
user> m2
{:a "a", :b "b"}
user> (= m1 m2)
true
user> (type m1)
clojure.lang.PersistentArrayMap
user> (type m2)
clojure.lang.PersistentHashMap
En el segundo ejemplo tenemos un mapa hash y un registro que son estructuralmente equivalentes, pero la función = devuelve falso:
user> (defrecord Titi [a b])
user.Titi
user> (def titi (Titi. 1 2))
#'user/titi
user> titi
#user.Titi{:a 1, :b 2}
user> (= titi {:a 1 :b 2})
false
¿Por qué son las diferencias? Estoy usando Clojure 1.3 y los encontré realmente confusos.
¿Por qué son iguales las instancias de PersistentArrayMap y PersistentHashMap con = dado que la función de tipo indica que no son del mismo tipo? – z1naOK9nu8iY5A
La promesa "type-and-value-based =" se establece en el docstring de 'defrecord' y se aplica a los registros. Por otro lado, se supone que los mapas regulares participan en un esquema = basado en el valor, y lo hacen, hasta el punto en que '(= (hash-map: foo 1: bar 2) (ordenado-mapa: foo 1: bar 2)) 'y' (= (java.util.HashMap. {: foo 1: bar 2}) {: foo 1: bar 2}) 'son ambos' verdaderos'. –