VFHandbuchKapitel4
Back to current versionRestore this version

Programm-Strukturen#


Wil Baden, auf den Sie in der englischsprachigen Literatur oft stoßen, hat in seinem Beitrag ESCAPING FORTH folgendes dargelegt: Es gibt vier Arten von Steueranweisungen :

Die ersten drei Möglichkeiten sind zwingend notwendig und in den älteren Sprachen wie PASCAL ausschließlich vorhanden. Entsprechend steht im volksFORTH eine Anweisung für die Auswahl von Programmteilen zur Verfügung, wobei die Ausführung vom Resultat eines logischen Ausdrucks abhängig gemacht wird:

flag IF <Anweisungen> THEN 
flag IF <Anweisungen> ELSE <Anweisungen> THEN

Soll dagegen im Programm ein Rücksprung erfolgen, um Anweisungen wiederho1t auszuführen, wird bei einer gegebenen Anzahl von Durchläufen diese Anweisung eingesetzt, wobei der aktuelle Index über I und J zur Verfügung steht:

<Grenzen> DO / ?DO <Anweisungen> LOOP 
<Grenzen> DO / ?DO <Anweisungen> <Schrittweite> +LOOP

Wenn eine Wiederholung von Anweisungen ausgeführt werden soll, ohne daß die Anzahl der Durchläufe bekannt 1st, so ist eine Indexvariable mitzuführen oder sonstwie zum Resultat eines logischen Ausdrucks zu kommen. Die folgende Konstruktion ermöglicht eine Endlos-Schleife:

BEGIN <Anweisungen> REPEAT

Die Wiederholungsanweisungen sind insoweit symmetrisch, daß eine Anweisung so­ lange (while) ausgeführt wird, wie ein Ausdruck wahr ist, oder eine Anweisung wiederholt wird, bis (until) ein Ausdruck wahr wird.

BEGIN <Anweisungen> flag UNTIL 
BEGIN <Anweisungen> flag WHILE <Anweisungen> REPEAT

Beide Möglichkeiten lassen sich in volksFORTH auch kombinieren, wobei auch mehrere (multiple) WHILE in einer Steueranweisung auftreten dürfen.

BEGIN <Anweisungen> flag WHILE <Anweisungen> flag UNTIL

Nun tritt in Anwendungen häufig der Fall auf, daß eine Steueranweisung verlassen werden soll, weil sich etwas ereignet hat.

Dann ist die vierte Situation, der Abbruch, gegeben, Die Programmiersprache "C" stellt dafür die Funktionen: break, continue, return und exit zur Verfügung; volksFORTH bietet hier exit, leave, endloop, quit, abort, abort" und abort( an. In FORTH wird EXIT dazu benutzt, um die Definition zu verlassen, in der es erscheint; LEAVE dagegen verläßt die kleinste umschließende DO...LOOP-Schleife.

Glossary#

Ab der Version 3.81.8 verfügt volksFORTH über eine zusätzliche Steueranweisung für den Compiler, die bedingte Kompilierung in der Form:

have <word> not .IF <action1> .ELSE <action2> .THEN

DieseWorte werden außerhalb von Colon-Definitionen eingesetzt und ersetzen das \needs früherer Versionen.

Worte zur Fehlerbehandlung#

Diese arbeiten auch wie Steueranweisungen, wie die Definitionen von ARGUMENTS und IS-DEPTH zeigen: :

is-depth ( n — )
  depth 1- — abort" falsche Parameterzahl!" ; 

IS-DEPTH überprüft den Stack auf eine gegebene Anzahl Stackelemente (depth) hin.

Fallunterscheidung in FORTH#

Strukturierung mit IF ELSE THEN / ENDIF#

An dieser Stelle soll kurz die vielfältigen Möglichkeiten gezeigt werden, mit denen eine Fallunterscheidung in FORTH getroffen merden kann. Kennzeichnend für eine solche Programmsituation ist, daß von verschiedenen Möglichkeiten des Programmflusses genau eine ausgesucht werden soll.

Ausgehend von einer übersichtlichen Problemstellung, einem Spiel, werden die notwendigen Grundlagendefinitionen und die Entwicklung der oben beschriebenen Kontrollstruktur beschrieben.

Als Beispiel dient ein Spiel mit einfachen Regeln:

Bei diesem Trinkspiel, das nach dem Artikel "Ultimate CASE-Statement" (Vierte Dimension 2/87, Seite 40 ff) auch CRAPS genannt wird, geht es darum, einen Vorrat von gefüllten Gläsern unter den Mitspielern mit Hilfe des Würfels zu verteilen und leerzutrinken:

Zuordnung ist also: 1=nehmen, 2/3=links, 4/5=rechts, 6=trinken und entsprechend der Augenzahl des Würfels soll eine der 6 möglichen Aktionen ausgeführt werden. Das Programm soll sich darauf beschränken, das Ergebnis dieses Würfelns einzulesen und auszuwerten. Daraufhin wird eine Meldung ausgegeben, welche der sechs Handlungen auszuführen ist.

Für ein solches Programm ist eine Zahleneingabe notwendig. Diese wurde hier mit dem Wort F83-NUMBERS realisiert:

: F83-number?  ( string -- d f )
   number? ?dup
   IF
     0<  IF extend THEN
     true exit
   THEN
   drop 0 0 false ;
   
: input#   (  string -- n )
   pad c/l 1- >expect
   pad F83-number? 2drop ;

Die Definition der Worter, die sechs oben genannten Aktionen symbolisch aus­führen sollen, richtet sich nach den Spielregeln, die für jedes Würfelergebnis genau eine Handlung vorschreiben:

\ nehmen  trinken  links  rechts  schieben

: nehmen  bright ." ein Glas nehmen"          normal  2 spaces ;
: trinken bright ." alle Gläser austrinken"   normal  2 spaces ;
: links   bright ." ein Glas nach links"      normal  2 spaces ;
: rechts  bright ." ein Glas nach rechts"     normal  2 spaces ;

: schieben ;

SCHIEBEN ist eine Dummyprozedur, ein Füllsel, dessen Notwendigkeit sich erst sehr spät ergibt. Für den Dialog mit dern Anwender wird deflniert:

: Anfrage    cr ." Sollen Sie nehmen, trinken oder schieben?" 
             cr ." Bitte Ihre Augenzahl und <cr> : " ;
             
: Glückwunsch  cr ." Viel Glück beim nächsten Wurf ..." ;