首页 > 解决方案 > Clojure Zippers - 将元数据与特定节点相关联?

问题描述

我正在使用 Clojure 的拉链来实现我认为不会特别具有挑战性的东西,但似乎我可能遗漏了一些东西。

基本上我想要做的是,给定一些数据结构作为列表,例如(1(2 3)4)),我希望能够将一些元数据与特定位置相关联,以便我可以做出决定loc 给定一个不同的 loc。

例如,使用 zipper 库中的 seq-zip,当我点击上面列表中的 2 的 loc 时,我想将一些任意数据与该 loc 关联,然后当我点击 loc 3 时,我想检查该数据(使用类似clojure.zip/prev 到达那里),然后根据该特定 loc 是否有一些与之关联的数据做出决定。

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

不幸的是,因为我正在使用的节点值可以是数字,所以我不能简单地用元数据补充节点值本身,除非我们将值装箱在某种包装器中,但这看起来相当难看,有任何想法吗?

标签: clojureclojurescriptzipper

解决方案


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


推荐阅读