: UNTIL ( -- ) ?COMPILING
COMPOST@ BEGINMARKE ?PAIRS
POSTPONE JOF
HERE 0 ,
OFFSET! ; IMMEDIATE
Merken Sie sich vor allem, dass
IF und
BEGIN Nachrichten
für
THEN und
UNTIL hinterlassen.
3. Unbedingte Sprünge
IF...THEN und
BEGIN...UNTIL haben jedes für sich
ein Gegenstück,
AHEAD...THEN und
BEGIN...AGAIN,
mit unbedingten Sprüngen.
Die Gegenstücke verwenden kein Flag, überprüfen nichts
und scheinen auf den ersten Blick sinnlos zu sein:
AHEAD ??? THEN ...
BEGIN ... AGAIN ???
AHEAD springt immer vorwärts auf
THEN zu,
und
AGAIN springt immer zurück nach
BEGIN.
Warum dann der Code
??? nach
AHEAD und
AGAIN,
der doch nie erreicht wird?
Diese Strukturen haben im Allgemeinen nur dann einen Sinn,
wenn sie unstrukturiert mit anderen Kontrollstrukturen zusammen verwendet werden.
... IF ... ELSE ... THEN ... können Sie
beispielsweise ansehen als
... IF ... AHEAD THEN ... THEN ,
wovon das erste
THEN zu
IF gehört
und das zweite
THEN zu
AHEAD.
Falsch geschachtelt also.
Sie können das mit einem Kunstgriff zum Funktionieren bringen,
wenn Sie nämlich den Compiler auf die eine oder andere Art dazu veranlassen,
genau zwischen
AHEAD und
THEN die letzten beiden
Nachrichtenpäckchen ihre Plätze tauschen zu lassen.
Dafür gibt es ein (Standard-)Wort:
1 CS-ROLL
: ELSE (--)
POSTPONE AHEAD 1 CS-ROLL
POSTPONE THEN ; IMMEDIATE
Denselben Trick können Sie auch mit
AGAIN aus dem Hut zaubern:
... BEGIN ... IF ... AGAIN THEN ... wird dann
... BEGIN ... IF ... AGAIN? ... mit
: AGAIN? ( -- )
POSTPONE AGAIN 1 CS-ROLL
POSTPONE THEN ; IMMEDIATE
Aber dafür hat man eine andere Lösung erdacht.
Mehr darüber das nächste Mal.