У меня следующая проблема:
(def relations1
'((child-of peter carl)
(child-of carl herb)
(peter x 0 y 0 age 6)
(carl x 1 y 1 age 36)
(herb x 2 y 2 age 66)))
Если родитель перемещается, ребенок перемещается на такое же расстояние, поэтому, если в новых отношениях указано, что herb и peter переместились, тогда я хочу обновить детей, которых нет в отношении Relations2, с тем же смещением, но тех, которые присутствуют, я оставлю их в покое. Итак, на следующем этапе:
(def relations2
'((herby2 x 3 y 2.5 age 66)
(pete2 x 0 y 0 age 6)))
Сначала я сопоставил Relations1 с отношениями в Relations2:
(def matches
'( ((herb x 2 y 2 age 66)
(herb2 x 3 y 2.5 age 66)),
((peter x 0 y 0 age 6)
(peter2 x 0 y 0 age 6))))
Я хочу go через сопоставленные, обновить свои собственные новые позиции (сохраняя свои прежние имена и возраст) и рекурсивно проверьте, есть ли у них дети, чтобы также обновить свои позиции. Я пробовал это, но в значительной степени застрял в том, как рекурсировать и для детей:
(def update-parents [matches, relations1]
(loop [rest matches
all relations1
result ()]
(if (empty? rest)
result
(let [[head & others] rest
r1 (first head)
r2 (second head)
exists (map first r2)
children (map second (filter #(and (= (first r1) (last %)) (= 'child-of (first %))) all))]
(if (some #(= (first r1) %) exists)
(recur others (concat (update r1 r2) (recur ???)); if it is already there, update position and its children's
; if it's not there, then ignore
)
Итак, конечный результат должен быть таким
(def result
'((herb x 3 y 2.5 age 66)
(peter x 0 y 0 age 6)
(carl x 2 y 1.5 age 36) ))
У меня две основные проблемы:
- children возвращает список дочерних элементов, поэтому мне нужно отфильтровать отношения1 по тем, которые находятся в этом списке
- как мне повторить для дочерних элементов? мне нужно использовать другой l oop?