209
Die Programmiersprache Forth
CATCH und THROW II
(Theo:)
Man verwendet CATCH und THROW in komplexen Programmen,
die Teile enthalten, deren Ablauf nicht immer vorhergesehen werden kann.
Um hier kein allzu ausgedehntes Beispiel geben zu müssen,
nehme ich meine Zuflucht zu einem Kunstgriff:
Ich betrachte das gesamte Forthsystem als ein komplexes Programm,
in welchem der Anwender viele unvorhergesehene Dinge tun kann
und in welchem folglich viele THROWs vorkommen.
Das gesamte Forth setze ich in ein CATCH und
da baue ich ein kleines Programm drum herum,
so dass du sehen kannst, was passiert.
Ziel des Ganzen: Demonstration der Funktion von THROW und CATCH.
Forth file: gc209.frt
\ CATCH and THROW
: .DEPTH ( - ) DEPTH 0 .R ." : "
DEPTH 0< \ Wenn noetig:
IF BEGIN 0 DEPTH 0= UNTIL \ Stackreparatur
." Stack underflow " \ mit Meldung.
THEN ;
: .TOP2 ( - ) \ Zeige, wenn vorhanden,
DEPTH 1 > \ die obersten zwei
IF OVER . THEN \ Zahlen, die sich auf
DEPTH IF DUP . THEN ; \ dem Stack befinden.
: .TOP4 ( - )
DEPTH 4 > IF ." ~ " THEN
DEPTH 2 > IF 2>R .TOP2 2R> THEN
.TOP2 ;
: STATE-MERKMAL ( - char )
STATE @ IF [CHAR] ] ELSE [CHAR] [ THEN ;
: .SITUATION ( - )
CR .DEPTH .TOP4 STATE-MERKMAL EMIT SPACE ;
CREATE EINGABEPUFFER 80 ALLOT
: EINGABE ( - adr len )
EINGABEPUFFER DUP 80 ACCEPT SPACE ;
: RISIKO-PROGRAMM ( - )
.SITUATION EINGABE EVALUATE ;
: BS ( - )
BEGIN ['] RISIKO-PROGRAMM CATCH
DUP
IF DUP . ." THROW ist ausgefuehrt "
THEN DROP
AGAIN ;