Frage

Ich bin Bäume von s-Ausdrücke für ein genetische Programmierung Problem, und Notwendigkeit, alte Teile der Bäume während des Evolutionsprozesses zu schaffen. Ich kam in der Clojure Reißverschluss Funktion, die wie es scheint perfekt sein sollte, aber für das Leben von mir kann ich nicht herauszufinden, wie es zu benutzen.

Zum Beispiel, sagen, dass ich schaffen einen Reißverschluss mit

(def zipped (zip/seq-zip `(+ (- 1 2) 3)))

Ich verstehe das an der Wurzel eines Baumes mit + darzustellen, eine, die wie folgt aussieht:

   +
 -   3
1 2

Mein Reißverschluss, nicht einverstanden ist aber nicht so: Wenn ich für den ersten Knoten mit (-> zipped zip/down zip/node) bitten, es gibt mir + (was richtig ist), aber es (-> zipped zip/down zip/down) braucht mich nicht zu -, sondern es nil zurückgibt. Tatsächlich gibt (-> zipped zip/down zip/rights) den Rest des Baumes als Geschwister rechts von der Wurzel, die mir zeigt, dass ich nicht habe einen Baum überhaupt:

user> (-> zipped zip/down zip/rights)
((clojure.core/- 1 2) 3)

Ich bin ziemlich sicher, dass ich meine Bäume darstellen richtig, denn wenn ich sie ausführen ich die richtige Antwort. Hat Reißverschluss ein anderes Layout erwarten?

War es hilfreich?

Lösung

Das Problem ist, dass es zwei unterschiedliche Vorstellungen von Baum hier los ist. Ihr Baum ist eine grafische Darstellung, wie sich die Werte versickern durch die Auswertung, sondern LISP über Listen von Listen denkt, und mit Präfixnotation:

'(+ (- 1 2) 3) ist auch (Liste + (Liste - 1 2) 3), die eigentlich dieser Baum ist:

+  .     3
   - 1 2

(-> zipped down node) gibt Ihnen das erste Element, +, ein Atom. (-> zipped down down) verschafft Ihnen somit gleich Null, weil das erste Element, +, ist ein Atom. (-> zipped down right down node) gibt Ihnen das Minuszeichen Sie wollen, denn das ist das erste Element des zweiten Elements des Ausdrucks.

Andere Tipps

Der Baum ist nicht, wie Sie haben es grafisch dargestellt. Der Wurzelknoten hat 3 Kinder: +, (- 1 2) und 3. Wenn Sie down vom Wurzelknoten zu tun, wird standardmäßig das am weitesten links Kind, also warum sehen Sie +.

Für die - erhalten würden Sie anrufen müssen:

user=> (-> zipped zip/down zip/right zip/down zip/node)
clojure.core/-
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top