我正在为遗传编程问题创建 s 表达式树,并且需要在进化过程中更改部分树。我遇到了Clojure 拉链功能,它看起来应该是完美的,但对于我的生活,我无法弄清楚如何使用它。
例如,假设我创建了一个拉链
(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)
我很确定我正确地表示了我的树,因为当我执行它们时,我得到了正确的答案。拉链是否期望不同的布局?