gpt4 book ai didi

clojure - 我如何格式化一棵树以使其与 Clojure 的 zipper 一起使用?

转载 作者:行者123 更新时间:2023-12-01 13:04:38 24 4
gpt4 key购买 nike

我正在为遗传编程问题创建 s 表达式树,并且需要在进化过程中改变部分树。我遇到了 Clojure zipper看起来应该是完美的功能,但对于我的生活,我无法弄清楚如何使用它。

例如,假设我创建了一个 zipper

(def zipped (zip/seq-zip `(+ (- 1 2) 3)))

我理解这是代表一棵在根部带有 + 的树,看起来像这样:

   +
- 3
1 2

不过,我的 zipper 不同意这一点:如果我用 (-> zipped zip/down zip/node) 请求第一个节点,它会给我 +(这是正确的)但它 (-> zipped zip/down zip/down) 不会带我到 -,而是返回 nil。事实上,(-> zipped zip/down zip/rights) 将树的其余部分作为根右侧的 sibling 提供,这向我暗示我根本没有树:

user> (-> zipped zip/down zip/rights)
((clojure.core/- 1 2) 3)

我很确定我正确地表示了我的树,因为当我执行它们时,我得到了正确的答案。 zipper 是否需要不同的布局?

最佳答案

问题是这里有两种不同的树概念。你的树是一个图表,显示了值如何通过评估渗透,但 LISP 正在考虑列表的列表,并使用前缀表示法:

'(+ (- 1 2) 3) 也是(list + (list - 1 2) 3),其实就是这棵树:

+  .     3
- 1 2

(-> zipped down node) 给你第一个元素,+,一个原子。(-> zipped down down) 因此给你 nil 因为第一个元素 + 是一个原子。(-> zipping down right down node) 为您提供所需的减号,因为这是表达式第二个元素的第一个元素。

关于clojure - 我如何格式化一棵树以使其与 Clojure 的 zipper 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902801/

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