depth-erste Indizierung eines Clojure-Formulars mit clojure.walk

8

Gegeben der folgende Baum (oder jedes andere Formular in Clojure einschließlich Karten und Vektoren):

%Vor%

Ich möchte eine Karte in Clojure erstellen, die jede Unterform nach einer Tiefenüberquerung des gesamten Formulars indiziert und auch einen Vektor (oder eine Liste) der Indizes der Untertypen der Form (falls vorhanden) bereitstellt.

%Vor%

Ich habe es bis jetzt nur geschafft, clojure.walk zu verwenden, um den ersten Teil zu erstellen (Indexierung der Unterformulare), aber ich bin verwirrt darüber, wie man auch die Indizes der Kinder erzeugt. Mein Code wird am Ende angehängt und erzeugt:

%Vor%

Also werden die Indizes zu den Unterformularen korrekt nach der Tiefen-zuerst-Traversierung erzeugt, aber ich sehe nicht, wie ich die Indizes der untergeordneten Elemente jeder Unterform erhalten kann. Ich habe versucht, das Zipp-Modul zu verwenden, aber ich konnte nicht sehen, wie man eine Tiefen-Traversierung durchführt, um die Indizes zu sammeln.

halbwegs Code

%Vor%     
Marcus Junius Brutus 13.02.2013, 23:28
quelle

2 Antworten

2
%Vor%     
mobyte 14.02.2013, 03:43
quelle
8

A walk ist rekursiv und bietet kein Akkumulatorargument, weshalb Sie auf die Aktualisierung von Atomen zurückgreifen mussten.

A zipper ist iterativ, so dass Sie andere Informationen mitnehmen können, ohne ein funktionelles Muster zu brechen.

Die natürliche Tiefe-zuerst-Traversierung ist eine Vorbestellungs-Traversierung, aber Sie sind nach einer Nachbestellung, daher erfordert dies ein wenig zusätzliche Arbeit.

Hier ist ein Post-Order-Traversal mit Reißverschlüssen:

%Vor%

Und der Testfall:

%Vor%

Um Ihre Anfrage abzuschließen, müssen wir die Baumpositionen nun wieder ihren Indizes zuordnen:

%Vor%

Etwas exotischer:

%Vor%     
A. Webb 14.02.2013 04:04
quelle

Tags und Links