MAL-Homepage
Inhaltsverzeichnis
MAL Dokumentation: Verbunde
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