Das Arbeiten mit Array's ist eine ständige Aufgabe beim Programmieren. Hier ist darunter eine Sammlung gleichartiger Daten zu verstehen, die durch einen Index adressiert werden können. Dieser Text wendet sich besonders an Anfängerund /oder Umsteiger. In Forth kann man diese Aufgabe auf verschiedenem Wege lösen.
Es wird eine Variable definiert, die den Anfang des Feldes beschreibt. Anschließend wird genügend Speicherplatz für die Elemente mit allot bereitgehalten.
variable feld
100 allot \ Platz für 50 Zahlen
feld 100 erase \ Eintragen von 0 für die 50 Zahleneinträge
Im Gegensatz zu anderen Porgrammiersorachen kann jetzt ein Bereich von 0 bis 50 angesprochen werden, es sind also 51 Speicherplätze vorhanden.
20 2 * feld + @
20 2 * feld + !
ermöglichen die Abfrage und Manipulation des 20 . Eintrages.
Besser geht es in Forth mit der Definition einer eigenen Variablenklasse:
: zahlenfeld
create ( länge --- ) \ Compilierverhalten 2 * allot does> ( index --- addr ) \ Laufzeitverhalten 2 * +
;
??? offensichtlich ungetested. oder beschreibt ein nicht-standardgemaesses „does>“.
in ueblichen Forths legt does> die body-adresse des defined words auf den stack, also auf den index drauf. im obigen beispiel wird die body addresse mit 2 multipliziert, und der index daraufaddiert. arrayschreiboperationen wuerden „irgendwo“ hingehen, und von nicht-bemerken bis systemcrash ziemlich alles zur folge haben. Mit einem Forth welches ueber ein „uebliches“ does> verfuegt (z.b. GForth, oder bigforth, sowie standardisierte Forths) wuerde es
does> swap cells +
heissen.
50 zahlenfeld feld
erzeugt ein ebensolches Feld wie oben beschrieben.
mit
20 feld @
20 feld !
läßt sich wieder der 20. Eintrag manipulieren und auslesen. Hier kann nun eine Schnittstelle zur OOF gezogen werden, indem die Daten durch (Funktions-) wörter verkapselt werden:
leider ist diese kapselung nur theoretischer natur, siehe oben. in der praxis wird „irgendwo“ hingeschrieben.
@eintrag ( nr — eintrag)
!eintrag (nr wert —)
Wenn man sich die oben genannten Varianten genau ansieht, dann tragen sie hinter einer Variablen Zahlen hintereinander ins Dictionary. Statt ein Feld zu initailisieren könnte auch eine Variable angelegt und die Were direkt ins Wörterbuch geschrieben werden:
variable daten 25 , 30 , 120 , 125 , 64 , usw.
Bei diesem Verfahren wäre die Länge des Feldes zwar nicht begrenzt, alledings lassen sich die Daten auch nicht ändern.
???? nicht aendern?
123 daten 3 cells + !
Charles Moore mag
: th cells + ;
damit wuerde dies lesbarer:
123 daten 3 rd ! daten 3rd @ .
Eine Hauptaufgabe für den Gebrauch eines Arrays ist es, die darin enthaltenen Daten zu sortieren. Der autor bevorzugt die Verfahren, in dem die vorhandenen Daten als Quelldaten angesehen und das Ergebnis in ein Zielfeld eingeschrieben wird.
Ein Wort dazu könnte lauten:
sort( addrq addrz anz — )
Es sortiert anz Einträge die ab Adresse addrq stehen in den Bereich ab Adresse addrz.