遺伝的プログラミングの問題のために 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)
ツリーを実行すると正しい答えが得られるため、ツリーを正しく表現していると確信しています。ジッパーは別のレイアウトを期待していますか?