我有一个Clojure数据结构,称为dom
,它是一个无限深度的向量和映射的树;
其中有一个特定的节点,我们称之为焦点节点focus
,它被视为路径进入树:一系列键的序列,比如你可以提供给get-in
我将在一个函数中决定聚焦节点,并希望以某种方式表示聚焦节点的选择,以便可以将其传递给另一个函数,而不会违反不可变性,并且不会与Clojure的持久数据结构发生冲突。
当我遍历树时,我想要特别对待focus
节点:例如,如果我正在打印树,则可能希望以粗体方式打印focus
节点。
如果我使用C或Java,我可以保存指向focus
节点的指针/引用,然后在遍历树时与当前节点进行比较。我认为这不是正确的Clojure实现方式:它感觉很巧妙,并且我相信有一些方法可以利用Clojure的持久数据结构来实现它。
解决方案必须适用于Clojure和ClojureScript。
我能想到的选项是:
- 存储引用并进行比较。
- 将标记附加到相关节点上。
同时递归进入树和路径到达有标记的节点。
- 选项(1)不太好,如我所解释的。
- 选项(2)似乎最好,并且在使用持久数据结构时是轻松的。
- 选项(3)类似于选项(2),只是它组合了标记和遍历步骤。
我相信这是一个常见的问题。是否有标准的解决方案呢?