我正在为遗传编程问题创建s表达式树,并需要在演化过程中修改树的部分内容。我发现Clojure zipper函数似乎非常适合,但是我真的想不出如何使用它。
例如,假设我用以下代码创建一个zipper:
我理解这代表着一棵以+为根的树,看起来像这样:
我的拉链不这么认为:如果我用
例如,假设我用以下代码创建一个zipper:
(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)
我相信我的树的表示是正确的,因为当我执行它们时,我得到了正确的答案。但是,zipper是否需要不同的布局呢?