gpt4 book ai didi

clojure - 如何 'mark' Clojure 数据结构中的节点?

转载 作者:行者123 更新时间:2023-12-04 15:34:09 24 4
gpt4 key购买 nike

我有

  • Clojure 数据结构,我们称之为 dom ,一棵向量树和
    不定深度的 map ;
  • 其中的一个特定节点,我们称之为 focus节点,简称
    进入树的路径:一系列键,例如您可以提供给get-in .

  • 我将决定一个函数中的焦点节点,我想以某种方式表示焦点节点的选择,这种方式可以以不违反不变性且不与 Clojure 的持久数据结构冲突的方式传递给另一个函数.

    当我遍历树时,我要处理 focus节点不同:例如,如果我正在打印树,我可能想打印 focus节点在 粗体 .

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

    该解决方案必须适用于 Clojure 和 ClojureScript。

    我能想到的选项是:
  • 存储一个引用并检查它。
  • 将标记附加到相关节点。
  • 同时递归到树中并沿着路径到达标记节点。
  • 正如我所解释的,选项 (1) 没有吸引力。
  • 选项 (2) 似乎是最好的,并且在考虑到持久数据结构的情况下没有痛苦。
  • 选项 (3) 与选项 (2) 类似,不同之处在于它结合了
    标记和遍历步骤。

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

    最佳答案

    我建议您重新考虑@MerceloMorales 的建议:使用元数据。您的节点对象具有不影响其正常功能的意外属性。这就是元数据的设计目的。它适用于 ClojureScript。我能想到的不使用元数据的唯一原因是节点值不是 Clojure 对象,而是例如一个数字。

    The Clojure Cookbook, 2.22. Keeping Multiple Values for a Key ,Luke Vanderhart 使用元数据解决了一个类似的问题:标记需要解释为集合而不是单个值的条目。

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

    我同意您对元数据的疑虑:将任何旧内容附加到您的数据中感觉很不舒服 - 就像用寄生虫感染它一样。但是,它与对象的任何其他部分一样是不可变的。

    使用 zipper 的建议很幼稚:standard clojure zippers设计用于顺序容器的层次结构,而不是关联容器。

    关于clojure - 如何 'mark' Clojure 数据结构中的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23846476/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com