Я не знаю, как сделать это с помощью Spectre, но вот функция, которая делает это с clojure.zip:
(defn splice-replace [zipper smap]
(loop [loc zipper]
(if (z/end? loc)
(z/root loc)
(recur
(z/next
(if-let [sub (smap (z/node loc))]
(reduce (comp z/right z/insert-right)
(z/replace loc (first sub))
(rest sub))
loc))))))
Вы можете вызвать его с помощью молнии вашей структуры данных и картыиз значений, которые вы хотите заменить, в последовательность их замещающих значений, которые будут вставлены в их положение:
(def zipper
(z/vector-zip [:top
[:arbitrary 1 2
[:nesting 2 3 [:needle]]]]))
(splice-replace zipper {[:needle] [[:n1] [:n2] [:n3]]})
=> [:top [:arbitrary 1 2 [:nesting 2 3 [:n1] [:n2] [:n3]]]]
(splice-replace zipper {[:nesting 2 3 [:needle]] (range 3 10)})
=> [:top [:arbitrary 1 2 3 4 5 6 7 8 9]]