Clojureのジッパーで動作するようにツリーをフォーマットするにはどうすればよいですか?
-
29-09-2019 - |
質問
私は遺伝的プログラミングの問題のためにS発現の木を作成しており、進化プロセス中に木の部分を変更する必要があります。私は出会いました Clojure 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は別のレイアウトを期待していますか?
解決
問題は、ここで起こっている木の2つの異なるアイデアがあることです。あなたのツリーは、評価によって値がどのように浸透するかのグラフですが、Lispはリストのリストについて考えており、プレフィックス表記を使用しています。
'( +(-1 2)3)も(リスト +(リスト-1 2)3)であり、実際にはこのツリーです。
+ . 3
- 1 2
(-> zipped down node)
最初の要素 +、原子を与えます。(-> zipped down down)
したがって、最初の要素 + +が原子であるため、nilを与えます。(-> zipped down right down node)
それが式の2番目の要素の最初の要素であるため、あなたが望むマイナスのサインを与えます。
他のヒント
木はあなたがそれを図にした方法ではありません。ルートノードには3人の子供がいます。 +
, (- 1 2)
, 、 と 3
. 。あなたがするとき down
ルートノードから、デフォルトは左の子供にデフォルトであるため、なぜあなたが見るのですか +
.
に到達するために -
あなたは電話する必要があります:
user=> (-> zipped zip/down zip/right zip/down zip/node) clojure.core/-