209a
<< <> >>

209

Die Programmiersprache Forth
home

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 ;
  
>>