204c
<< <> >>
: 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.
[wird fortgesetzt]
einde
 >>