DO <name> <Schleifenbedingung> <anweisungen-1> [[CASE {EMPTY | END | QUIT } <anweisungen-2>] ... ] END <name>
<name> enthält eine Bezeichnung für die Schleife. In geschachtelten Schleifen muss der Name eindeutig sein. Der <name> in DO und END muss derselbe sein.
Die <Schleifenbedingung> legt fest, wie oft die Schleife durchlaufen werden soll. Die verschiedenen Möglichkeiten sind unten beschrieben.
Die <Anweisungen-1> sind Ausdrücke, die bei jedem Schleifendurchlauf ausgeführt werden. Spezielle Asudrücke, die nur in Schleifen benutzt werden können, sind SKIP und QUIT.
SKIP <name>
<name> muss der Name aus der DO-Anweisung sein.
SKIP bewirkt, dass die Anweisungen hinter dem SKIP für den aktuellen Schleifendurchlauf nicht mehr ausgeführt werden. Die Verarbeitung geht mit der nächsten Auswertung der Schleifenbedingung weiter.
Bei geschachtelten Schleifen ist der Aussprung sowohl aus der inneren als auch aus einer äußeren Schleife möglich. Der Aussprung aus einer äußeren Schleife bewirkt effektiv einen QUIT aus der inneren Schleife, weil die Schleifenbedingung der inneren Schleife nicht weiter ausgeführt wird. CASE QUIT wird dabei jedoch nicht aktiviert, da es sich nicht um eine ausdrückliche QUIT-Anweisung handelt.
QUIT <name>
<name> muss der Name aus der DO-Anweisung sein.
QUIT bewirkt, dass die Schleifenverarbeitung sofort beendet wird. Die Anweisungen hinter dem QUIT werden nicht mehr ausgeführt, und die Schleifenbedingung wird nicht neu ausgewertet.
Wenn ein CASE QUIT codiert ist, werden die dort stehenden Anweisungen ausgeführt.
Bei geschachtelten Schleifen ist der Aussprung sowohl aus der inneren als auch aus einer äußeren Schleife möglich. Der Aussprung aus einer äußeren Schleife bewirkt effektiv auch einen QUIT aus der inneren Schleife, weil die Schleifenbedingung der inneren Schleife nicht weiter ausgeführt wird. Ein CASE QUIT der inneren Schleife wird dabei jedoch nicht aktiviert, da es sich nicht um eine ausdrückliche QUIT-Anweisung handelt.
Über CASE können Anweisungen codiert werden, die nur ausgeführt werden, wenn die Schleife mit einem bestimmten Zustand endet:
DO <name> ONCE <anweisungen> [<case-anweisungen>] END <name>
Die Schleife wird exakt ein Mal ausgeführt.
Ein CASE EMPTY ist für eine Einmal-Schleife sinnlos, da die Schleife bedingungslos ausgeführt wird.
QUIT und SKIP bewirken beide den Aussprung aus der Schleife, mit dem Unterschied, dass bei einem QUIT ggf. die Anweisungen aus CASE QUIT ausgeführt werden.
DO <name> FOREVER <anweisungen> [<case-anweisungen>] END <name>
Die Schleife wird solange ausgeführt, bis sie mit einem QUIT verlassen wird.
Ein CASE EMPTY ist für eine Endlos-Schleife sinnlos, da die Schleife bedingungslos ausgeführt wird und mindestens ein Schleifendurchlauf stattfinden muss, um auf eine QUIT-Anweisung zu stoßen.
DO <name> VARY <var-1> FROM <expr-1> [ BY <expr-2 > ] [{TO | DOWNTO } <expr-3>] [{WHILE | UNTIL } <cond-2>] <anweisungen> [<case-anweisungen>] END <name>
<var-1> und <expr-1> bis <expr-3> sollten numerische Werte beinhalten, das Ergebnis ist sonst undefiniert.
<var-1> ist der Zähler, in der Regel eine lokale Variable. Die FROM-Angabe gibt den Ausgangswert des Zählers an. Hinter BY steht, um welchen Wert der Zähler bei jeder Auswertung der Bedingung verändert werden soll; Default ist 1. Hinter TO oder DOWNTO geben Sie an, bei welchem Wert die Schleife enden soll: benutzen Sie TO, wenn der Endwert höher ist als der Anfangswert, DOWNTO, wenn der Endwert niedriger ist als der Anfangswert. Wenn TO oder DOWNTO nicht angegeben sind, wird die Schleife so lange ausgeführt, bis sie mit einem QUIT verlassen wird.
Die Zählschleife kann mit einer kopf- oder fußgesteuerten Schleife kombiniert werden. Dabei muss zuerst die VARY-Angabe, anschließend die WHILE- bzw. UNTIL-Angabe codiert werden. Bei der Auswertung der Bedingung wird ebenfalls zuerst die Zählbedingung, anschließend die WHILE- bzw. UNTIL-Bedingung berücksichtigt.
DO <name> { WHILE | UNTIL } <cond-1> <anweisungen> [<case-anweisungen>] END <name>
<cond-1> entscheidet darüber, wie lange die Schleife ausgeführt wird: Solange die Bedingung wahr ist, wird die Schleife jeweils neu durchlaufen. Sobald die Bedingung einmal unwahr ist, wird die Verarbeitung beendet.
Die WHILE-Schleife ist die kopfgesteuerte Schleife: Hier wird die Bedingung vor Ausführung der Anweisungen ausgewertet. Wenn die Bedingung vor dem ersten Durchlauf bereits falsch ergibt, bleibt die Schleife leer, und falls vorhanden werden die Anweisungen aus CASE EMPTY ausgeführt.
Die UNTIL-Schleife ist die fußgesteuerte Schleife: Hier werden erst die Anweisungen ausgeführt, und anschließend die Bedingung ausgewertet, um zu entscheiden, ob ein folgender Durchlauf stattfinden soll. Die Anweisungen werden bei der fußgesteuerten Schleife also immer mindestens einmal ausgeführt, so dass die fußgesteuerte Schleife nicht leer sein kann, ein CASE EMPTY also nie eintreten kann.
DO <name> FOR EACH [{<obj-1>|RECORD} IN] <obj-2> [ WHERE <cond-1> ] [{WHILE | UNTIL } <cond-2>] <anweisungen> [<case-anweisungen>] END <name>
Wenn <obj-1>angegeben ist, muss es den Namen eines Record-Objekts enthalten, <obj-2> den eines Mengenobjekts. Die beiden Objekte müssen vom selben Typ sein.
Falls eine WHERE-Bedingung angegeben ist, wird die Schleife nur durchgeführt, wenn für den aktuellen Listensatz die Bedingung zutrifft.
Wenn <obj-1> angegeben ist, stellt die TAA-Infrastruktur eine Verknüpfung her zwischen <obj-1> und <obj-2>, sodass der Inhalt von <obj-1> physisch derselbe ist wie der des aktuellen Satzes aus <obj-2>. Alle Veränderungen, die Sie an den Einzelobjekt vornehmen, nehmen Sie in Wirklichkeit in dem aktuellen Satz des Mengenobjekts vor, und wenn Sie das Einzelobjekt löschen, löschen Sie in Wirklichkeit den aktuellen Satz des Mengenobjekts. Sie können <obj-1> so z.B. als Argument für einen Modulaufruf verwenden, der ein Record-Objekt von diesem Objekttyp als Parameter erwartet.
Bei Beginn der Schleife wird eine Liste aller zu dem Zeitpunkt in dem Mengenobjekt enthaltenen Elemente angelegt, und nur diese Liste wird abgearbeitet. Die TAA-Infrastruktur erkennt, wenn ein Element aus dieser Liste zwischenzeitlich aus dem Mengenobjekt gelöscht wurde, und überspringt dieses dann. Wenn in dem Mengenobjekt während der Schleife neue Elemente eingefügt wurden, werden diese nicht mit verarbeitet.
Die Objektmengen-Schleife kann mit einer kopf- oder fußgesteuerten Schleife kombiniert werden. Dabei muss zuerst die FOR EACH-Angabe, anschließend die WHILE- bzw. UNTIL-Angabe codiert werden. Bei der Auswertung der Bedingung wird ebenfalls zuerst die Objektmengenbedingung, anschließend die WHILE- bzw. UNTIL-Bedingung berücksichtigt.