如何设置树的格式,使其与Clojure';s拉链?

如何设置树的格式,使其与Clojure';s拉链?,clojure,tree,genetic-programming,zipper,Clojure,Tree,Genetic Programming,Zipper,我正在为一个遗传编程问题创建s表达式树,并且需要在进化过程中改变部分树。我发现这个函数似乎应该是完美的,但就我的一生而言,我不知道如何使用它 例如,假设我使用 (def zipped (zip/seq-zip `(+ (- 1 2) 3))) 我理解这表示一棵树的根是+的,一棵看起来像这样的树: + - 3 1 2 不过,我的拉链不同意这一点:如果我要求第一个节点使用(>zip-zip/down-zip/node),它会给我+(这是正确的),但它(>zip-zip/down-zi

我正在为一个遗传编程问题创建s表达式树,并且需要在进化过程中改变部分树。我发现这个函数似乎应该是完美的,但就我的一生而言,我不知道如何使用它

例如,假设我使用

(def zipped (zip/seq-zip `(+ (- 1 2) 3)))
我理解这表示一棵树的根是+的,一棵看起来像这样的树:

   +
 -   3
1 2
不过,我的拉链不同意这一点:如果我要求第一个节点使用
(>zip-zip/down-zip/node)
,它会给我
+
(这是正确的),但它
(>zip-zip/down-zip/down)
不会带我到
-
,而是返回
零。事实上,
(>zipped-zip/down-zip/rights)
将树的其余部分作为同级,放在根的右侧,这向我表明我根本没有树:

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

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

这棵树不是你绘制的。根节点有3个子节点:
+
(-12)
,和
3
。当您从根节点向下执行
操作时,它默认为最左边的子节点,因此您可以看到
+

要访问
-
,您需要拨打:

user=> (-> zipped zip/down zip/right zip/down zip/node) clojure.core/- 用户=>(->压缩压缩/向下压缩/右压缩/向下压缩/节点) clojure.core/-
问题是,这里有两种不同的树木观念。您的树是一个值如何通过计算渗透的图形,但LISP考虑的是列表列表,并使用前缀表示法:

“(+(-12)3)也是(list+(list-12)3),实际上是这棵树:

+  .     3
   - 1 2
(>压缩节点)
为您提供第一个元素+,一个原子。
(>向下压缩)
因此为零,因为第一个元素+,是一个原子。
(>zip down right down node)
为您提供所需的减号,因为这是表达式第二个元素的第一个元素。

感谢您的解释,它为我澄清了问题。我不认为我需要按照执行的顺序遍历树,所以我可能仍然可以使用拉链。