204c
<< <> >>
: UNTIL ( -- ) ?COMPILING
  COMPOST@ BEGINKENMERK ?PAIRS
  POSTPONE JOF
  HERE  0 ,
  OFFSET! ; IMMEDIATE
Onthoud vooral dat IF en BEGIN boodschappen achterlaten voor THEN en UNTIL.

3. Onvoorwaardelijke sprongen

IF...THEN en BEGIN...UNTIL hebben elk een tegenhanger, AHEAD...THEN en BEGIN...AGAIN, met onvoorwaardelijke sprongen. Zij gebruiken geen vlag, doen geen test en lijken op het eerste gezicht zinloos:
AHEAD ??? THEN ...
BEGIN ... AGAIN ???
AHEAD springt altijd vooruit naar THEN en AGAIN springt altijd terug naar BEGIN. Waarom dan de code ??? achter AHEAD en AGAIN die toch nooit bereikt wordt?

Deze structuren hebben over het algemeen alleen zin als ze ongestructureerd met andere controlestructuren gebruikt worden.

... IF ... ELSE ... THEN ... kun je bijvoorbeeld zien als
... IF ... AHEAD THEN ... THEN waarvan de eerste THEN bij IF hoort en de tweede THEN bij AHEAD. Foutief genest dus. Je kunt dit met een kunstgreep kloppend krijgen als je, precies tussen AHEAD en THEN in, op een of andere manier de laatste twee postpakketjes bij de compiler van plaats kunt laten verwisselen.

Daar is een (standaard)woord voor: 1 CS-ROLL
: ELSE (--)
  POSTPONE AHEAD 1 CS-ROLL
  POSTPONE THEN ; IMMEDIATE
Je zou dezelfde truc met AGAIN kunnen uithalen:
... BEGIN ... IF ... AGAIN THEN ... wordt dan
... BEGIN ... IF ... AGAIN? ... met
: AGAIN? ( -- )
  POSTPONE AGAIN 1 CS-ROLL
  POSTPONE THEN ; IMMEDIATE
Maar hiervoor heeft men een andere oplossing bedacht. Meer daarover de volgende keer.
[wordt vervolgd]
>>