209
De programmeertaal Forth
CATCH en THROW II
Theo:
Je gebruikt CATCH en THROW in complexe programma's
die onderdelen bevatten waarvan de afloop niet altijd te voorzien is.
Om hier niet zo'n programma te hoeven maken neem ik mijn toevlucht tot een kunstgreep:
Ik beschouw de gehele Forth als een complex programma waar de gebruiker
vele onvoorziene dingen mee kan doen en waar dus vele THROW's in voorkomen.
De gehele Forth zet ik in een CATCH.
Daar komt een klein programmaatje omheen waardoor je kunt zien wat er gebeurt.
Doel van dit alles: de functie van THROW en CATCH demonstreren.
Forth file: c209.frt
\ CATCH and THROW (Albert Nijhof)
FORTH DEFINITIONS DECIMAL
: .DEPTH ( ? -- )
DEPTH 0 .R ." : "
DEPTH 0< \ Indien nodig:
IF BEGIN 0 DEPTH 0= UNTIL \ Stackreparatie
." Stack underflow " \ met melding.
THEN ;
: .TOP2 ( - ) \ Toon, indien aanwezig,
DEPTH 1 > IF OVER . THEN \ de bovenste twee
DEPTH IF DUP . THEN ; \ getallen op stack.
: .TOP4 ( ? -- )
DEPTH 4 > IF ." ~ " THEN
DEPTH 2 > IF 2>R .TOP2 2R> THEN
.TOP2 ;
: STATE-TEKEN ( - char )
STATE @ IF [CHAR] ] ELSE [CHAR] [ THEN ;
: .SITUATIE ( - )
CR .DEPTH .TOP4 STATE-SIGN EMIT SPACE ;
CREATE INVOERBUFFER 80 ALLOT
: INVOER ( - adr len )
INVOERBUFFER DUP 80 ACCEPT SPACE ;
: RISICO-PROGRAMMA ( - ) .SITUATIE INVOER EVALUATE ;
: VB ( - )
BEGIN ['] RISICO-PROGRAMMA CATCH
DUP IF DUP . ." THROW is uitgevoerd " THEN DROP
AGAIN ;