Inhaltsverzeichnis

catch throw

Schritt für Schritt durch catch den throw.

Hier zunächst die Begriffsklärung.

sp@ ( – addr ) Zeiger auf den obersten Datenstackeintrag.

rp@ ( – addr ) Zeiger auf den obersten Returnstackeintrag.

sp! ( addr – ) Stellt den Datenstackzeiger auf addr ein. Damit wird die Tiefe des Datenstack auf den selben Wert eingestellt, der bestand unmittelbar bevor sp@ ausgeführt wurde.

rp! ( addr – ) Stellt den Returnstackzeiger auf addr ein. Damit wird die Tiefe des Returnstack auf den selben Wert eingestellt, der bestand unmittelbar bevor sp@ ausgeführt wurde.

Die Abkürzungen bedeuten:

Schritt für Schritt durchs CATCH

variable handler \ Variable für den letzten Ausnahmefall.

\                                    Leg den Ausnahmerahmen hier an.
\                                    v  v
: CATCH ( xt -- exc# | 0 )               ( 1)  ( 2)
    sp@ >r         ( -- xt) ( RS: -- sp     )  ( 3)
    handler @ >r   ( -- xt) ( RS: -- sp hlr )  ( 4)
    rp@ handler !  ( -- xt) ( RS: -- sp hlr )  ( 5)
    execute        ( --   ) ( RS: -- sp hlr )  ( 6) 
    r> handler !   ( --   ) ( RS: -- sp     )  ( 7)
    r> drop        ( --   ) ( RS: --        )  ( 8)
    0              ( -- 0 )                    ( 9)  ;

Schritt für Schritt durchs THROW

\ TROW springt zum gesicherten Rahmen falls  #exc <> 0 ist. 
: THROW     ( i*x exc# -- i*x exc# | i*x exc# ) ( RS: -- sp hlr i*adr ) ( 1)
    dup 0=                 ( -- i*x exc# f  ) ( RS: -- sp hlr i*adr )   ( 2)
    if drop exit then      ( -- i*x         ) ( RS: -- sp hlr i*adr )   ( 3)
    handler @ rp!          ( -- i*x exc#    ) ( RS: -- sp hlr       )   ( 4) 
    r> handler !           ( -- i*x exc#    ) ( RS: -- sp           )   ( 5)
    r>                     ( -- i*x exc# sp ) ( RS: --              )   ( 6)
    swap                   ( -- i*x sp exc# ) ( RS: --              )   ( 7)
    >r                     ( -- i*x sp      ) ( RS: -- exc#         )   ( 8)
    sp!                    ( -- xt          ) ( RS: -- exc#         )   ( 9)
    drop r>                ( -- exc#        ) ( RS: --              )   ( 10) ;

Beispiel:

\ Ermögliche dem "spam" eine Ausnahmenummer weiter zu geben.
: spam ( -- ) ... #exc THROW ;  

\ Schließe "spam" in eine Ausnahmeregelung ein.
: spam-exc ( i*x -- )
  ...
  ['] spam CATCH  ( -- #exc )
  dup 0= IF drop exit then \ = NOOP
  dup #exc = IF
    ...  \ Bekannte Ausnahme handhaben. 
  else
    ... throw  \ unvorhergesehene Ausnahme weitergeben an das Forthsystem.
  then ;            

Bildergeschichte

Catch und Throw als Bildergeschichte
S5 Slide Show - downloaden, auspacken und dann die datei index.html mit dem browser starten.

( finis)