Clojureのジッパーで動作するようにツリーをフォーマットするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3902801

質問

私は遺伝的プログラミングの問題のために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/-
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top