Nie mam jasności co do strukturalnego udostępniania w Clojure. Poniżej znajduje się funkcja xconj zaczerpnięta z Joy of Clojure (Great book BTW).Udostępnianie strukturalne w Clojure
;;Building a naive binary search tree using recursion
(defn xconj [t v]
(cond
(nil? t) {:val v :L nil :R nil}
(< v (:val t)) {:val (:val t) :L (xconj (:L t) v) :R (:R t)}
:else {:val (:val t) :L (:L t) :R (xconj (:R t) v)}))
Jeśli zdefiniowano dwa drzewa t1 i t2, jak pokazano poniżej.
(def t1 (xconj (xconj (xconj nil 5) 3) 2))
(def t2 (xconj t1 7))
Jest oczywiste, że lewica poddrzewo jest dzielona przez t1 & t2
user> (identical? (:L t1) (:L t2))
true
Ale jeśli jeden z nich, aby utworzyć nowe drzewo t3, wkładając nową wartość „1” w lewym poddrzewie t1, na przykład:
(def t3 (xconj t1 1))
Spowoduje to w zupełnie nowym drzewie ze wszystkich wartości skopiowane i nie dzielenie strukturalny, czy będzie jakiś struktura nadal być udostępniane? Co jeśli lewy oddział był większy, powiedzmy 2-> 3-> 4-> 5-> 6-> 7 (* root), a 1 został wstawiony w lewy poddrzewo, czy pozostanie jakaś struktura podziału?
Dzięki za sugestię aktualizacji/przydziału, zdecydowanie bardziej zwięzły sposób aktualizowania map. – Jaskirat