2012-05-27 9 views
16

Czy można polegać na (= m (zipmap (keys m) (vals m))) w Clojure 1.3 +?Mapy Clojure: czy klucze i vals są w tej samej kolejności?

Mając to zachowanie sprawia, że ​​nieco bardziej czytelnego kodu w niektórych sytuacjach, np

(defn replace-keys [smap m] 
    (zipmap (replace smap (keys m)) (vals m))) 

vs.

(defn replace-keys [smap m] 
    (into {} (for [[k v] m] [(smap k k) v])) 
+1

Ogólnie rzecz biorąc, nie wydaje mi się, żeby dobrze było rozważyć "pozycję" w przypadku struktury danych mapy. – Ankur

+0

Czy w 2013 r. Jest to szczegół wdrożenia lub obietnica? – ToBeReplaced

Odpowiedz

18

Tak, wiele Clojure pęknie jeśli to zmienić.

Mapy są zapisywane jako drzewa, a obie funkcje prowadzą to samo drzewo w tej samej kolejności.

+0

Czy dokumentacja jest udokumentowana w dowolnym miejscu, czy tylko szczegół implementacji, który może ulec zmianie? –

+0

Sprawdź [to pytanie] (https://groups.google.com/forum/?fromgroups#!topic/clojure/s1sFVF7dAVs) w grupie Google Clojure. Jest to praktycznie to samo pytanie, nawet do sformułowania. –

+0

tak, znalazłem to _ po opublikowaniu, chociaż wyglądałem – timc

Powiązane problemy