WHILE ist die Lösung, auf die ich das letzte Mal abzielte.
Es ist ein
IF, das seine Post an den Compiler nicht ganz nach oben,
sondern direkt unter die oberste Post legt.
Sie können
WHILE daher nur
innerhalb einer
anderen Kontrollstruktur verwenden.
Die andere Struktur muss wieder abgeschlossen sein,
bevor das zugehörige
THEN kommt.
WHILE schachtelt sich über Kreuz und dient dazu,
aus einer Struktur nach
THEN zu springen:
: WHILE ( -- )
POSTPONE IF
1 CS-ROLL ; IMMEDIATE
.. BEGIN .. WHILE .. AGAIN THEN ..
1 2 1 2
Die Ziffern geben an, wie die Worte zueinander gehören.
WHILE ist innerhalb aller anderen Kontrollstrukturen verwendbar. Beispiele:
a) .. BEGIN .. WHILE .. UNTIL .. THEN ..
1 2 1 2
b) .. BEGIN .. WHILE .. AGAIN ELSE .. THEN ..
1 2 1 2 2
c) .. BEGIN .. WHILE .. WHILE .. AGAIN THEN .. THEN ..
1 2 3 1 3 2
In c) legt
WHILE-2 seine Post unter
BEGIN-1 ab,
WHILE-3 legt seine Post auch unter
BEGIN-1 ab,
also oberhalb von
WHILE-2.
Die beiden WHILEs sind untereinander wieder normal geschachtelt.
Fangfrage:
Was ist der Unterschied zwischen
OEL und
ESSIG?
: OEL aaa IF bbb IF ccc THEN THEN ddd ;
: ESSIG aaa IF bbb WHILE ccc THEN THEN ddd ;
Bemerkung:
REPEAT (ein Standardwort) steht für
AGAIN THEN.
.. BEGIN .. WHILE .. REPEAT ..