Clojure Zippers - Связываете метаданные с конкретным узлом? - PullRequest
0 голосов
/ 04 мая 2019

Я использую застежки-молнии Clojure для реализации того, что, по моему мнению, не будет особенно сложным, но, похоже, я что-то упускаю.

По сути, я хочу сделать, учитывая некоторую структуру данных в виде спискаНапример, (1 (2 3) 4)), я хочу иметь возможность связать некоторые метаданные с определенным местоположением, чтобы я мог принимать решения об этом местоположении, учитывая другое местоположение.

Например,используя seq-zip из библиотеки zipper, когда я нажимаю loc для 2 в приведенном выше списке, я хочу связать некоторые произвольные данные с этим loc, затем, когда я нажимаю loc 3, я хочу просмотреть эти данные (используя что-то вроде clojure.zip/ prev, чтобы попасть туда), а затем принять решение, основываясь на том, были ли с этим конкретным loc какие-то данные, связанные с ним.

Однако это не кажется особенно простым, я попытался связать некоторыеданные против loc, но после использования clojure.zip/next, данные все еще присутствуют на карте loc, что не то, что я хотел.

К сожалению, потому чтоЗначения узлов, с которыми я работаю, могут быть числами, я не могу просто дополнить сами значения узлов метаданными, если я не собираюсь помещать значения в какую-то оболочку, но это кажется довольно уродливым, любые идеи

1 Ответ

2 голосов
/ 04 мая 2019

В каждый момент времени существует только один значимый loc объект: это ваш «курсор» в заархивированную структуру данных. Таким образом, вы можете хранить метаданные только на глобальном уровне. Поскольку у ваших узлов нет места для самих метаданных, вы можете либо обернуть узлы (например, просто глобально обернуть все на карте, как предлагает Алан Томпсон), либо сохранить в loc достаточно мощную карту метаданных, чтобы содержать все, что вы хотите знать обо всех узлах. Например, метаданные loc могут содержать карту, ключи которой являются путями в застежке-молнии, а значения - украшениями для узла на этом пути. Это не идеально, потому что если вы отредактируете структуру своего дерева, метаданные останутся висячими. Но если вы сделаете обход дерева, сохраняющий структуру, это может сработать. Лично мне идея Алана нравится больше. Представлять данные как данные.

...