209a
<< <> >>

209

De programmeertaal Forth
home

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