tobotras: (Default)
[personal profile] tobotras
Попробовал 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))

Date: 2013-03-04 07:11 pm (UTC)
From: [identity profile] rblaze.livejournal.com
Фу, сколько скобочек.

Date: 2013-03-04 07:44 pm (UTC)
From: [identity profile] deadmustdie.livejournal.com
Хм... не знаток ни Closure, ни zippers, но тут же явно побочный эффект используется. Т.е. модифицируется исходное XML-дерево, переданное как аргумент (результат вызова функции разбора документа). Значит, достаточно запомнить первоначальный аргумент, с которым вызывается zero-deltas, и вернуть его из zero-deltas. Возможно, понадобится промежуточное замыкание (для хранения ссылки на исходное дерево).

Date: 2013-03-05 05:48 pm (UTC)
From: [identity profile] deadmustdie.livejournal.com
Хм.. тот самый случай, когда чистые функции дают более корявый код по сравнению с возможным вариантом, использующим побочные эффекты - при всех его недостатках.
Найденное решение (Update2) выглядит как минимум странно, и может сломаться при смене версии zippers.

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 Feb. 13th, 2026 04:29 pm
Powered by Dreamwidth Studios