205b
<< <> >>

5. DO-LOOP, CASE

Das Paar DO-LOOP arbeitet zur Run-Time wie ein BEGIN-AGAIN mit den folgenden Zusätzen:
  1. DO ( grenze zaehler -- ) baut einen Zählmechanismus auf.
  2. Innerhalb der Schleife ist der Zähler über I abfragbar.
  3. LOOP passt den Zähler nach jedem Durchlauf an.
  4. LOOP beendet die Schleife, wenn der Zähler den vorgegebenen Bereich abgearbeitet hat.
    Für die ganz Genauen unter Ihnen: Der vorgegebene Bereich ist abgearbeitet, wenn der Zähler die "Grenzlinie" zwischen 'grenze-minus-1' und 'grenze' überschreitet. Diese Überlegung gilt auch für sowohl positive als auch negative Schritte bei +LOOP.
 10 1 DO ...           ( 1 2 .. 9 klar )
  0 0 DO ...           ( 0 1 .. -2 -1 klar )
 20 0 DO ...  2 +LOOP  ( 0 2 .. 18 klar )
-10 0 DO ... -1 +LOOP  ( 0 -1 .. -10 klar )
  0 0 DO ... -1 +LOOP  ( 0 klar )
Man verwendet LEAVE zum vorzeitigen Abbruch einer DO-LOOP:
.. DO .. IF LEAVE THEN .. LOOP aaa
LEAVE räumt die Zählverwaltung auf und leitet einen Sprung nach aaa, unmittelbar hinter LOOP, ein.

Auch zur Compile-Time gleicht DO-LOOP dem BEGIN-AGAIN. Sie können daher mit WHILE einen Sprung aus einer DO-LOOP compilieren. Das kann günstig sein, wenn die bedingt abgebrochene Schleife ganz anders fortgesetzt werden soll als die vollständig abgearbeitete Schleife:
.. DO .. WHILE LOOP aaa ELSE .. I .. UNLOOP THEN ..
aaa wird ausgeführt, wenn LOOP die Schleife beendet hat. Das Stückchen zwischen ELSE und THEN kommt einzig und allein nach einer bedingten Unterbrechung zum Tragen. Meistens lässt sich das mit LEAVE nicht elegant schreiben.

Zwei Dinge fallen auf:
  1. Es ist immer explizit ein UNLOOP nötig, um im Run-Time-Modus die Zählverwaltung aufzuräumen.
  2. I ist außerhalb der Schleife verwendbar, solange die Zählverwaltung noch intakt ist.
LEAVE (immer) und LOOP (nach dem letzten Durchlauf) führen implizit ein UNLOOP aus.

Zum Schluss das CASE-Konstrukt in Forth, ein viel besprochener Gegenstand. Ist er derartige Aufmerksamkeit wert? Ich denke, dass CASE völlig überflüssig ist. Forth hat dafür genügend bessere Formulierungen. Könnte es sein, dass der Bedarf an CASE vor allem von jenen Forth-Anfängern gefühlt wird, die von anderen Sprachen her kommen und die die begreifliche Neigung haben, aus ihrer vertrauten Umgebung heraus eins-zu-eins zu übersetzen (m.E. die Forth-Hemmschwelle schlechthin)?

einde
 >>