Я не понимаю о структурном разделении в Clojure. Ниже приведена функция xconj, взятая из Радости Clojure (Великая книга BTW).Структурный обмен в 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)}))
Если вы определяете два дерева t1 и t2, как показано ниже.
(def t1 (xconj (xconj (xconj nil 5) 3) 2))
(def t2 (xconj t1 7))
Очевидно, что левое поддерево разделяет t1 & t2
user> (identical? (:L t1) (:L t2))
true
Но если бы нужно было создать новое дерево t3, вставляя новое значение «1» в левом поддереве t1, как это:
(def t3 (xconj t1 1))
будет этот результат в совершенно новом дереве со всеми значения скопированы и никакого структурного обмена, или некоторые структуры по-прежнему совместно? Что, если бы левая ветвь была больше, то в левом поддереве было вставлено 2-> 3-> 4-> 5-> 6-> 7 (* корень) и 1, а затем некоторое разделение структуры сохраняется?
Спасибо за предложение update-in/assoc-in, определенно более краткий способ обновления карт. – Jaskirat