2015-08-24 2 views
1

На прошлой неделе я пытался написать алгоритм с молниями для обновления конкретного элемента в вложенных структурах данных, How to move an element within a structure, possibly with zippers?Можно ли написать общий алгоритм для обновления элемента в вложенной (независимо от того, как вложенная) структура данных с помощью Zipper?

Моего ответа там решает эту проблему для этой точной структуры вложенности больше элементов ломает алгоритм.

Это сделало мысль, можно ли написать общий алгоритм с помощью Zippers для обновления определенных данных во вложенной структуре данных (независимо от того, как это вложен)? Или Молнии только тогда, когда вы точно знаете свои шаги?

Мне нужно понять, что, правильно, я пытаюсь сделать молнии, чтобы сделать что-то, что не для чего созданы молнии.

ответ

1

Абсолютно вы можете использовать молнии таким образом, так как вы можете перемещать zip в любом направлении, которое вы выбираете. В качестве примера рассмотрим zip-visit library, который предлагает произвольное посещение застежек-молний, ​​с возможностью изменения узлов по мере необходимости.

Пример взят из документации:

(def s "<div><span id='greeting'>Hello</span> <span id='name'>Mr. Foo</span>!</div>") 
(def root (z/xml-zip (xml/parse (java.io.ByteArrayInputStream. (.getBytes s))))) 

(defn replace-element [id replacement] 
    (visitor :pre [n s] 
    (if (= (:id (:attrs n)) id) {:node replacement}))) 

user=> (pprint (:node (visit root nil [(replace-element "name" "Mr. Smith")]))) 
{:tag :div, 
:attrs nil, 
:content 
[{:tag :span, :attrs {:id "greeting"}, :content ["Hello"]} 
    "Mr. Smith" 
    "!"]} 

Конечно, вы можете также использовать простую ходьбу для выполнения подобных задач, пример, который находится на this SO question on traversing maps.

0

Chiron

Взгляните на data.zip, поскольку она обеспечивает способность к цепи предикатами, чтобы получить все записи, представляющие интерес, а также обновления узлов.