: 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.