At runtime, the pair DO-LOOP works just like BEGIN-AGAIN with the following extra's:
-
DO ( boundary start_count -- ) builds a count mechanism.
-
Inside the loop the count is accessible with I.
-
LOOP adjusts the count after each iteration.
-
LOOP falls through when the counter has finished the indicated range.
To formulate it precisely: the counter finishes the indicated range
when it passes the "fence post" between 'boundary-minus-1' and 'boundary.'
The same goes for positive
and negative steps in case of
+LOOP.
10 1 DO ... ( 1 2 .. 9 ready )
0 0 DO ... ( 0 1 .. -2 -1 ready )
20 0 DO ... 2 +LOOP ( 0 2 .. 18 ready )
-10 0 DO ... -1 +LOOP ( 0 -1 .. -10 ready )
0 0 DO ... -1 +LOOP ( 0 ready )
The word
LEAVE is used to prematurely exit a DO-LOOP:
.. DO .. IF LEAVE THEN .. LOOP aaa
LEAVE removes the counter administration and causes
a jump to
aaa, immediately after
LOOP.
DO-LOOP resembles BEGIN-AGAIN even at compile-time.
That's why it is possible to use
WHILE to compile a jump out of a DO-LOOP.
This has its use when the continuation of the conditionally aborted loop
differs substantially from that of the normal loop:
.. DO .. WHILE LOOP aaa ELSE .. I .. UNLOOP THEN ..
aaa is executed when
LOOP finishes the loop.
The part between
ELSE and
THEN is used only
after the conditional loop exit.
In most cases there is no way to do this elegantly using
LEAVE instead.
Two remarks:
-
In all cases, the counter administration must be removed explictly
using UNLOOP.
-
I is usable outside the loop,
as long as the counter administration is still intact.
LEAVE (always) and
LOOP (after the last pass)
implicitly execute
UNLOOP.
To finish off, Forth's
CASE-construct.
Hot debates have accompanied CASE ever since it was first proposed.
Is it worth all that attention? Some people, including this author, think not.
Forth has so many constructs available that
CASE is actually redundant.
Some people feel that
CASE is only there to let Forth beginners
feel at home with a construct they might recognize from their previous
programming environments (and that this is doing more bad than good).