我如何格式化一棵树,以便与Clojure的拉链一起使用?
-
29-09-2019 - |
题
我正在为遗传编程问题创建S表达树木,并需要在进化过程中对树木的一部分进行修饰。我遇到了 克洛杰尔拉链 看起来应该是完美的功能,但是对于我的生命,我不知道如何使用它。
例如,说我用
(def zipped (zip/seq-zip `(+ (- 1 2) 3)))
我理解这是代表带有 +的树,看起来像这样的树:
+
- 3
1 2
不过,我的拉链不同意这一点:如果我要求第一个节点 (-> zipped zip/down zip/node)
它给了我 +
(是正确的)但是 (-> zipped zip/down zip/down)
不带我去 -
, ,而是返回 nil
. 。确实, (-> zipped zip/down zip/rights)
将树的其余部分作为兄弟姐妹在根的右边,这向我表明我根本没有树:
user> (-> zipped zip/down zip/rights)
((clojure.core/- 1 2) 3)
我很确定我正确地代表我的树木,因为当我执行它们时,我会得到正确的答案。拉链期望有不同的布局吗?
解决方案
问题在于,这里有两种不同的树木想法。您的树是一个值的图表,说明了值如何通过评估渗透,但是LISP正在考虑列表列表,并使用前缀表示法:
'( +(-1 2)3)也是(列表 +(列表-1 2)3),实际上是此树:
+ . 3
- 1 2
(-> zipped down node)
给您第一个元素 +,一个原子。(-> zipped down down)
因此为您提供了零,因为第一个元素 +是一个原子。(-> zipped down right down node)
为您提供所需的减号,因为这是表达式第二个元素的第一个元素。
其他提示
这棵树不是您将其绘制的方式。根节点有3个孩子: +
, (- 1 2)
, , 和 3
. 。当你这样做的时候 down
从根节点中,它默认为最左边的孩子,因此为什么看到 +
.
到达 -
您需要致电:
user=> (-> zipped zip/down zip/right zip/down zip/node) clojure.core/-
不隶属于 StackOverflow