Leo: |
BS leert den Stack, dann kommt eine 1 und die wird gedupt.
[rtn] ( 1 1 0 ) okOh ja, und die Extra-Null. Warum übrigens die Null? |
Theo: |
Wirst du gleich sehen.
BS 2 ' ; CATCH .S [rtn] ( 2 -14 ) okWenn die Extra-Zahl von CATCH eine Null ist, bedeutet das, dass der Vorgang geglückt ist. Wenn der Vorgang nicht glückt, dann liefert er anstelle der Null eine Fehlernummer. |
Leo: | Was ist denn dann in diesem Fall nicht geglückt? |
Theo: |
Probier mal dasselbe mit EXECUTE.
BS 2 ' ; EXECUTE .S [rtn] Compile-only word (message # -14) |
Leo: |
Hm!
(2 Minuten Stille) Das .S hinter EXECUTE wird nicht ausgeführt, das hinter CATCH aber sehr wohl. |
Theo: |
Richtig. EXECUTE wirft hier das Handtuch.
CATCH fängt eventuelle Fehler auf und sorgt dafür,
dass der Stack wiederhergestellt wird, d.h.,
dass er nach der misslungenen Befehlsausführung genauso tief ist wie vorher.
CATCH ersetzt das Token des missglückten Vorgangs
durch die Fehlernummer.
Nach gelungenen Befehlsausführungen kommt die Erfolg vermeldende Null
naturgemäß oberhalb des erreichten Ergebnisses zu liegen.
Sieh dir mal BS 1 an.
Und das folgende Beispiel: BS 3 S" DUP" ' EVALUATE CATCH .S |
Leo: |
Das hat denselben Effekt wie Beispiel 1.
[rtn] ( 3 3 0 ) ok |
Theo: |
Richtig. Aber jetzt das:
BS 4 S" vijg" ' EVALUATE CATCH .S |
Leo: |
Dieses "vijg" kann nicht ausgewertet ("evaluiert") werden,
also wird nach der 4 eine bestimmte Fehlernummer auf den Stack gelegt.
[rtn] ( 4 0 0 -61 ) okWo kommen die zwei Nullen her? |
Theo: | Bedenke, dass nach einem Fehler der Stack vor und nach CATCH gleich tief ist. |
Leo: | Ah ja, natürlich, der vijg-String lag ja auch auf dem Stack. Aber warum hat der sich in 0 0 verwandelt? |