Tôi không rõ ràng về chia sẻ cấu trúc trong Clojure. Dưới đây là một chức năng xconj lấy từ Joy of Clojure (cuốn sách tuyệt vời BTW).Chia sẻ cấu trúc trong 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)}))
Nếu một định nghĩa hai cây t1 và t2 như được hiển thị bên dưới.
(def t1 (xconj (xconj (xconj nil 5) 3) 2))
(def t2 (xconj t1 7))
Rõ ràng là các cây con trái được chia sẻ bởi t1 & t2
user> (identical? (:L t1) (:L t2))
true
Nhưng nếu ai đó để tạo ra một t3 cây mới, bằng cách chèn một giá trị mới '1' trong cây con trái của t1, như thế này:
(def t3 (xconj t1 1))
Điều này sẽ tạo ra một cây hoàn toàn mới với tất cả các giá trị được sao chép và không chia sẻ cấu trúc hoặc một số cấu trúc vẫn được chia sẻ? Điều gì sẽ xảy ra nếu nhánh bên trái lớn hơn 2-> 3-> 4-> 5-> 6-> 7 (* root) và 1 được chèn vào trong cây con trái, khi đó một số cấu trúc sẽ tồn tại?
Cảm ơn đề nghị cập nhật/assoc-in, chắc chắn một cách gọn gàng hơn để cập nhật bản đồ. – Jaskirat