2014-09-15 5 views
0

У меня есть дерево (список списков), я хотел бы изменить выбранный узел дерева.Обновление дерева в clojure

[ 
    [:a1] 
    [ 
    [:b1, b2] 
    [:c1, c2] 
    ] 
] 

Например, я хотел бы добавить b3 к узлу (массив) с b записей.

[ 
    [:a1]    ; 0 
    [     ; 1 
    [:b1, b2, b3] ; 1, 0 
    [:c1, c2]  ; 1, 1 
    ] 
] 

Вопрос: как обновить узел данный список индексов, где я могу найти целевой узел ([1, 0])? На других языках с изменчивым деревом я мог просто найти массив и сделать target_node.append("b3"), что невозможно в clojure.

Я хотел бы избежать явного использования изменяемых объектов Java.

Связанные

+0

Помните, что если у вас есть неизменные структуры вы просто вернуть новое дерево с новым значением положите его на место. – soulcheck

+1

Возможно, вы захотите использовать карты вместо векторов. – soulcheck

ответ

2

update-in будет делать то, что вы хотите:

user=> (def t [[:a1] [[:b1 :b2] [:c1 :c2]]]) 
#'user/t 
user=> (update-in t [1 0] conj :b3) 
[[:a1] [[:b1 :b2 :b3] [:c1 :c2]]] 
Смежные вопросы