Next: Pro2Lisp: Reader für Up: Lisp2Pro: Pretty-Printer für Previous: Ausgabeformate

Der Maßbaum

Dieser Abschnitt behandelt ein wesentliches Merkmal der Implementierung.

Eine Frage, die sich im Laufe der Ausgabe wiederholt stellt, lautet: Paßt der Rest des Ausdrucks noch auf dieselbe Zeile oder muß ein Umbruch erfolgen? Um diese Frage für einen Ausdruck der Form zu beantworten, könnte man zunächst in P-Syntax in einem String zwischenspeichern. Stellt sich nun heraus, daß alles auf eine Zeile paßt, ergeben sich keine Nachteile. Ist dies jedoch nicht der Fall, so werden auf separate Zeilen verteilt. Für jedes stellt sich nun wieder die gleiche Frage. Daher muß jedes nun zum zweiten Mal in einen String transformiert werden. Je schmaler die Zeilen, je tiefer die Verschachtelung, desto größer wird die Ineffizienz des Verfahrens.

Um das zu vermeiden, werden zwei Läufe über den auszugebenden Ausdruck gemacht. Der erste ergänzt Längeninformationen und wandelt alle atomaren Bestandteile (Zahlen, Symbole) in Strings um. Als Ergebnis entsteht ein Maßbaum (measure-tree). Der zweite Lauf entscheidet anhand dieser Informationen über das Format und führt die Ausgabe durch.

Ein Knoten des Baumes ist dabei durch folgenden Datentyp definiert:
(defstruct pro-expr type ; dom(type) = {round-application, sqr-application, ; argument-list, arg-list-tail, is, ; variable-binding, atomic} len ; dom(len) = integer value ; The value depends on the type-field ) Zwei einfache Beispiele sollen den Maßbaum verdeutlichen. Zunächst sei eine Konstante auszugeben:
> (construct-measure-tree 'son nil)
#S(pro-expr type atomic len value ''son'') Weil verschachtelte Strukturen durch den Lisp-Pretty-Printer nur schwer lesbar ausgegeben werden, enthält Lisp2Pro zu Debugging-Zwecken die Funktion pps (pretty-print-structure), die in diesem Fall die folgende Ausgabe erzeugt:
> (pps (construct-measure-tree 'son nil))
(*pro-expr*) Type: ATOMIC Len: Val: son Der Parameter nil in construct-measure-tree steuert die Ausgabe verschachtelter Strukturen und ist hier nicht von Interesse.

Nun soll ein Funktionsaufruf ausgegeben werden.
> (pps (construct-measure-tree '(likes eve adam) nil))
(*pro-expr*) Type: ROUND-APPLICATION Len: Val: [ (*pro-expr*) Type: ATOMIC Len: Val: likes (*pro-expr*) Type: ARGUMENT-LIST Len: Val: [ (*pro-expr*) Type: ATOMIC Len: Val: eve (*pro-expr*) Type: ATOMIC Len: Val: adam ] ] Wenn type mit round-application besetzt ist, enthält value eine Liste aus Funktor und Argumentliste. Analog ist value mit einer Liste aus Argumenten besetzt, falls in type argument-list steht. Die Beziehung zwischen diesen beiden Feldern ist im Quelltext ausführlich dokumentiert.

Die Länge 11 der Argumentliste (eve, adam) errechnet sich wie folgt: Der Gesamtausdruck likes(eve, adam) hat damit die Länge 16.



Next: Pro2Lisp: Reader für Up: Lisp2Pro: Pretty-Printer für Previous: Ausgabeformate


Harold Boley & Michael Herfert (herfert@dfki.uni-kl.de)