Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何';马克';Clojure数据结构中的节点?_Clojure_Clojurescript - Fatal编程技术网

如何';马克';Clojure数据结构中的节点?

如何';马克';Clojure数据结构中的节点?,clojure,clojurescript,Clojure,Clojurescript,我有 Clojure数据结构,我们称之为dom,一个向量树和 深度不定的地图 其中的一个特定节点,我们称之为focus节点,称为 树中的路径:可以呈现给用户的一系列键 进入 我将决定一个函数中的聚焦节点,我希望以某种方式表示聚焦节点的选择,这种方式可以传递给另一个函数,不会违反不变性,也不会与Clojure的持久数据结构冲突 当我遍历树时,我希望以不同的方式处理焦点节点:例如,如果我正在打印树,我可能希望以粗体打印焦点节点 如果使用C或Java,我可以保存一个指向focus节点的指针/引用,

我有

  • Clojure数据结构,我们称之为
    dom
    ,一个向量树和 深度不定的地图
  • 其中的一个特定节点,我们称之为
    focus
    节点,称为 树中的路径:可以呈现给用户的一系列键
    进入
我将决定一个函数中的聚焦节点,我希望以某种方式表示聚焦节点的选择,这种方式可以传递给另一个函数,不会违反不变性,也不会与Clojure的持久数据结构冲突

当我遍历树时,我希望以不同的方式处理
焦点
节点:例如,如果我正在打印树,我可能希望以粗体打印
焦点
节点

如果使用C或Java,我可以保存一个指向
focus
节点的指针/引用,在遍历树时可以将其与当前节点进行比较。我不认为在Clojure中这样做是正确的:它让人感觉很粗糙,而且我相信有一些方法可以利用Clojure的持久数据结构

解决方案必须在Clojure和ClojureScript中工作

我能想到的选择是:

  • 存储一个引用并对照该引用进行检查
  • 将标记附着到相关节点
  • 同时递归到树中并沿着标记节点的路径递归

    • 正如我所解释的,选项(1)没有吸引力
    • 选项(2)似乎是最好的,并且在给定持久数据结构的情况下是无痛的
    • 选项(3)与选项(2)相似,只是它结合了 标记和遍历步骤

  • 我相信这是一个常见的问题。有标准的解决方案吗?

    我建议您重新考虑@Mercelomolales的建议:使用元数据。节点对象将具有一个不会影响其正常功能的意外属性。这就是元数据的设计目的。它在ClojureScript中工作。我认为不使用元数据的唯一原因是节点值不是Clojure对象,而是一个数字

    在中,Luke Vanderhart使用元数据解决了类似的问题:标记需要解释为集合而不是单个值的条目

    另一种方法可能是使用拉链遍历/修改节点树。zipper是根据元数据实现的——您已经猜到了

    我和你一样对元数据感到担忧:将任何旧的东西附加到数据上都会让人感到不舒服——就像用寄生虫感染数据一样。然而,它只是对象中不可变的一部分


    使用拉链的建议是天真的:它们是为顺序容器的层次结构而设计的,而不是关联容器

    有关这类问题的一些重要概述,请参见Brandon Bloom's

    我认为,易于“标记”或以其他方式更新树结构数据是他强烈建议始终将节点表示为嵌套映射而不是向量(或向量和映射的混合)的基础。基于键向量描述的路径的标记如下所示:

     (update-in tree-data path assoc :is-focussed true)
    

    您的原始数据结构保持不变,更新返回的新数据结构在结构上与原始数据结构共享所有内容,但更新的节点除外,该节点现在可以轻松测试
    :在遍历时聚焦
    属性。

    我想您可以使用元数据实现2,但我不知道通用解决方案谢谢。我可以使用元数据,但可能不会。这个问题比实现的范围要广一点。重读它不会有什么坏处,但我不认为我问的问题主要是基于观点的。完全有可能(我也不知道)有一个标准的惯用模式来实现这一点。如果答案是“否”,这是一个有效的答案。听起来像是功能性镜片的使用案例。也许是clojure.zip?谢谢你的回答。也许我不清楚我所说的元数据:我使用它没有问题,但是我是否使用元数据或其他方法来存储“标记”并不重要。我只是问了一个关于这个方法的更一般的问题。我想我一直在努力表达我的问题,也许不应该给出一个例子。我只想根据路径指示树中的特定节点,以便另一个函数可以识别该节点。我来看看是否可以修改这个问题,使它更清楚。@Joe说得很好:)。不过,例子有帮助。