Я не уверен насчет структурного обмена в Clojure.Ниже приведена функция xconj, взятая из Joy of Clojure (Великая книга BTW).
;;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 (* root) и 1 была вставлена в левое поддерево, сохранится ли некоторое разделение структуры?