Clojure拉链-将元数据与特定节点关联?

时间:2019-05-03 23:29:18

标签: clojure clojurescript zipper

我正在使用Clojure的拉链来实现我认为并不是特别有挑战性的东西,但是看来我可能会缺少一些东西。

基本上,我想要做的是,给定一些数据结构作为列表,例如(1(2 3)4)),我希望能够将某些元数据与特定位置相关联,以便我可以在给定其他位置的情况下对该位置做出决定。

例如,使用来自拉链库的seq-zip,当我在上面列表中点击2的位置时,我想将一些任意数据与该位置相关联,然后当我点击loc 3时,我想检查该数据(使用诸如clojure.zip/prev之类的方法到达该位置),然后根据该特定位置是否有与之关联的数据做出决定。

但是,似乎不是特别简单,我尝试将一些数据与loc关联,但是在使用clojure.zip/next之后,数据仍然存在于loc映射中,这不是什么我想要。

不幸的是,因为我正在使用的节点值可以是数字,所以我不能简单地用元数据对节点值本身进行补充,除非我们要用某种包装方法将这些值装箱,但这似乎很难看,有什么想法吗?

1 个答案:

答案 0 :(得分:2)

一次只有一个有意义的loc对象:它是压缩数据结构中的“光标”。因此,您只能在其上全局存储元数据。由于您的节点本身没有存储元数据的空间,因此您可以包装节点(例如,按照Alan Thompson的建议将所有内容整体包装在地图中),或者在loc中存储足够强大的元数据地图以包含您想要的所有内容了解所有节点。例如,loc的元数据可以包含一个映射,其键是拉链中的路径,其值是该路径处节点的修饰。这不是理想的,因为如果您编辑树的结构,则元数据将保持悬空状态。但是,如果对树进行保留结构的遍历,则可能会起作用。我个人更喜欢Alan的想法。将数据表示为数据。