Mar. 4th, 2013

tobotras: (Default)
Попробовал zippers. Задача — поменять все <delta value="XXX"> на <delta value="0">:
(defn- zero-deltas [zip]
  (loop [loc zip]
    (if (zip/end? loc)
      loc
    (recur (zip/next (if (= (:tag (zip/node loc)) :delta)
   	                 (zip/edit loc #(assoc-in % [:attrs :value] "0"))
                         loc))))))

Всё хорошо, но непонятно, что можно вернуть из функции, чтобы можно было аналогичную звать дальшe:
(-> filename parse xml-zip 
    zero-deltas
    something-else)

Переписал на data.xml с рекурсивным беганием map-ами по :content. Омерзительно. В недоумении.

Upd: слава аллаху опенсорсу, я таки посмотрел в исходники clojure.zip. Они держат сопутствующие структуры в метаданных. Убиться веником.

Upd2: работает вот так, но недоумение остаётся:
  (if (zip/end? loc)
      (with-meta (vector (zip/root loc) nil) (meta zip))

Profile

tobotras: (Default)
tobotras

December 2024

S M T W T F S
123 4567
891011121314
15161718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 11th, 2025 09:07 am
Powered by Dreamwidth Studios