MAL-Homepage Inhaltsverzeichnis



MAL Dokumentation: Verbunde




Inhalt:

1. ALLGEMEINES
2. OFT BENÖTIGTE WORTE
3. SORIEREN UND SUCHEN
4. TRANSPONIEREN


1. ALLGEMEINES

Fast alle Worte, die für die Verarbeitung von Verbunden verwendet werden können, sind auch für Strings anwendbar. Daher sind sowohl die Worte für die Verbundbearbeitung wie auch jene für die Stringverarbeitung unter dem Topic
field zusammengefasst.

Ein Verbund wird durch Klammerung von beliebigen Stackeinträgen mit den Worten [ und ] erstellt. Bei der Ablistung eines Verbundes mit dem Wort ´.´ (Punkt) wird bei jeder fünften Komponente der Index eingeblendet.

Mit dem Wort ramp kann ein Verbund mit einer Rampenfunktion erzeugt werden. Die Rampe hat stets einen Startwert von 0 und eine Schrittweite von 1. Bei Bedarf kann man den Startwert durch Addition einer Konstanten und die Schrittweite durch Multiplikation mit einer Konstanten verändern.

Einen mit Nullwerten gefüllten Verbund erreicht man am besten indem man eine Rampe mit 0 multipliziert.

Beispiele:

[ 17 12 3 7 1 8 9 4 18 ] .

[ 17 12 3 7 1 <- 5
8 9 4 18 ]


5 ramp .

[ 0 1 2 3 4 <- 5
]


7 ramp 10 / 2 + .

[ 2 2.1 2.2 2.3 2.4 <- 5
2.5 2.6 ]


3 ramp 0 * .

[ 0 0 0 ]

MAL-Homepage Inhaltsverzeichnis


2. OFT BENÖTIGTE WORTE

Mit den folgenden Worten wird man praktisch ständig konfrontiert, wenn man in MAL programmiert oder MAL-Programme zu lesen hat.

Das Wort
count übergibt die Anzahl von Komponenten in einem Verbund.

Der Standardbefehl für das Indizieren einer Komponente aus einem Verbund ist das Wort , (Komma).

Beispiele:

[ 3 5 7 6 2 ] 2 , .
5


"Das ist ein String" 3 , .
s


Sind die Komponenten mit einem Namen versehen, so kann man sie mit dem Wort \ (Backslash) indizieren.

Beispiel:

[
"Huber" "Familienname" >name
1.86 "Körpergröße" >name
34 "Alter" >name
] >> person


person \ Familienname .
Familienname=Huber


person \ Alter .
Alter=34


Das Wort \\ unterscheidet sich von \ nur syntaktisch. Der Name wird nicht in Postfixschreibweise angeführt, sondern muß als String am Stack übergeben werden. Man benötigt es, wenn man den Namen dynamisch versorgen will. In allen anderen Fällen ist \ zu bevorzugen, da es leichter lesbar ist.

: eine_komponente >> komponentenname
person komponentenname \\ . cr ;


[ "Familienname" "Körpergröße" ] each eine_komponente
Familienname=Huber
Körpergröße=1.86



In den folgenden zwei Tabellen sind die Worte für das Indizieren von Komponenten aus einem Verbund zusammengestellt:

WORT SYNTAX BEMERKUNG
, feld index -> komp Komponente nach Nummer holen
\ feld -> name komp Komponente nach Namen holen
\\ feld name -> komp Komponente nach Namen holen
' feld -> name index Suchen nach einem Namen
'' feld name -> index Suchen nach einem Index


Während diese Worte Komponenten die Codestrings enthalten automatisch exekutieren, wird bei den analogen Worten mit vorangestellter Bezeichnung ´cool´ die Ausführung von Codestrings unterbunden.

WORT SYNTAX BEMERKUNG
cool, feld index -> komp Komponente nach Nummer holen
cool\ feld -> name komp Komponente nach Namen holen
cool\\ feld name -> komp Komponente nach Namen holen

MAL-Homepage Inhaltsverzeichnis


3. SORIEREN UND SUCHEN

Das Wort
sort kann für das Sortieren eines Verbundes nach einem frei definierbaren Sortierkriterium verwendet werden. Das Sortierkriterium ist in Form eines Strings mit MAL-Code, der aus jeder Komponente eine Zahl oder einen String berechnet, anzugeben. Dieser Code muß also folgender Syntax entsprechen:

komponente -> zahl

oder

komponente -> string

Die Syntax von ´sort´ sieht folgendermaßen aus:

verbund kriterium -> neuverbund

Beispiele:

"hgieja" "" sort .

[ a e g h i <- 5
j ]


[ 7 3 5 1 ] "" sort .

[ 1 3 5 7 ]


[
[ "Müller" "Name" >name "Hans" "Vorname" >name ]
[ "Huber" "Name" >name "Willi" "Vorname" >name ]
[ "Zauner" "Name" >name "Gertrud" "Vorname" >name ]
]
"\ Name" sort .

[

[
Name=Huber
Vorname=Willi ]

[
Name=Müller
Vorname=Hans ]

[
Name=Zauner
Vorname=Gertrud ] ]


[ 6 -3 -5 -6 1 3 ] "abs" sort .

[ 1 -3 3 -5 6 <- 5
-6 ]


Das Wort sort arbeitet durch Aufbau eines binären Suchbaumes. Der Algorithmus läuft am schnellsten bei gut durchmischten Daten, wird aber sehr langsam, wenn die Daten bereits sortiert sind.

Die Worte find und binary_search dienen zum Suchen von Komponenten in einem Verbund. Während find den Verbund von vorne nach hinten durchsucht und die Suche mit der ersten gefunden Komponente abbricht, setzt binary_search einen sortierten Verbund voraus und sucht nach allen entsprechenden Komponenten.

Syntax von find:

muster komponente -> index

Wird nichts gefunden, so wird der Index 0 übergeben.

Syntax von binary_search:

muster verbund kriterium -> [ i1 .. iN ] endindex

Der Datensatz ´muster´ muß das Suchmuster enthalten, nach dem im Verbund gesucht wird. Eine Komponente wird nur als gleich erkannt, wenn sie vollkommen übereinstimmt. Dabei wird auch die Groß/Kleinschreibung und der Name der Komponente berücksichtigt. Der bei binary_search verwendete Parameter ´kriterium´ muß einen MAL-Code (als String oder Codestring) enthalten. Dieser Code kann dazu verwendet werden, jede Komponente vor dem Vergleich mit dem Muster aufzubereiten. Als Ergebnis von binary_search erhält man einen Verbund, der die Indizes aller gefundenen Komponenten enthält und einen Parameter ´endindex´, der den Index bei dem die Suche beendet wurde enthält. Zweiterer wird benötigt, wenn man neue Komponenten in den Verbund einfügen will, ohne die Sortierung zu zerstören.

Das Wort mirror dreht die Sortierreihenfolge in einem Verbund um.



MAL-Homepage Inhaltsverzeichnis


4. TRANSPONIEREN

Die Zeilen- und Spaltenstruktur eines zweidimensionalen Verbundes kann mit dem Wort
transpose verändert werden. Betrachtet man den Verbund als zweidimensionale Matrix, so führt ´transpose´ eine Spiegelung an der Hauptdiagonale durch.

Beispiel:

[
[ 1 2 3 ]
[ 4 5 6 ]
]


transpose .

[
[ 1 4 ]
[ 2 5 ]
[ 3 6 ] ]


Voraussetzung für das Transponieren ohne Datenverlust ist, daß die Zeilen des Verbundes gleich lang sind (gleich viele Komponenten besitzen). Bei ungleichen Längen, werden alle Zeilen auf die kleinste Länge gekürzt.



MAL-Homepage Inhaltsverzeichnis