208b
<< <> >>
Leo: BS leert den Stack, dann kommt eine 1 und die wird gedupt.
[rtn] ( 1 1 0 ) ok
Oh ja, und die Extra-Null. Warum übrigens die Null?
Theo: Wirst du gleich sehen.
BS 2 ' ; CATCH .S [rtn] ( 2 -14 ) ok
Wenn 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 ) ok
Wo 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?
>>