ToDo: Kontrolle

Hamsterskript: Schleifen

Eine Schleife veranlasst die wiederholte Ausführung einer oder mehrerer Anweisungen. Die Wiederholung oder ihr Abbruch kann von einer Bedingung abhängig gemacht werden. Diese Bedingung ist fast immer als Boolescher Ausdruck anzugeben.

Jede Schleife beginnt mit dem Schleifenkopf, dem der Schleifenrumpf mit den zu wiederholenden (iterierenden) Anweisungen folgt und wird mit dem Schleifenfuß abgeschlossen:

do # Schleifenkopf
  # Schleifenrumpf mit Anweisungen
loop # Schleifenfuß
In dieser Form würde die Schleife alle Anweisungen in ihrem Rumpf endlos wiederholen. Schleifen können mit der „break()“-Anweisung bedingt oder unbedingt abgebrochen werden. In den Klammern ist ein Boolescher Ausdruck als Abbruchbedingung anzugeben. Die Schleife wird dann bei Erreichen der „break()“-Anweisung abgebrochen, wenn die Bedingung in den Klammern erfüllt ist; „break“ allein bricht unbedingt ab. Bei Abbruch der Schleife wird mit der ersten, auf den Schleifenfuß folgenden Anweisung fortgefahren, die der „break()“-Anweisung folgenden Anweisungen im Rumpf werden dann nicht mehr ausgeführt.

Die „continue()“-Anweisung verhindert im Schleifenrumpf ebenfalls die Ausführung der ihr folgenden Anweisungen, bricht aber die Schleife nicht ab, sondern veranlasst einen erneuten Durchlauf bei der ersten Anweisung des Rumpfes. In den Klammern lässt sich dafür eine Bedingung angeben, „continue“ allein bewirkt in jedem Falle eine erneute Iteration.

Bedingte oder unbedingte „break()“- und „continue()“-Anweisungen dürfen in den Rümpfen aller Schleifenkonstrukte des Hamsters beliebig oft vorkommen. Schleifen können verschachtelt werden; eine „break()“-Anweisung bricht nur die Schleife ab, in deren Rumpf sie ausgeführt wird.

Präkonditionale Schleife

Mit einer dem Schleifenkopf unmittelbar folgenden „break()“-Anweisung erhält man eine präkonditionale Schleife. Dieser häufige Spezialfall wird mit einem Schleifenkonstrukt berücksichtigt, das im Schleifenkopf auch gleich die Bedingung aufnimmt, unter der die Anweisungen im Rumpf ausgeführt werden sollen:

while( <boolean expression> )
  # Schleifenrumpf mit Anweisungen
endwhile

Die Anweisungen im Rumpf werden ausgeführt, solange die durch den Booleschen Ausdruck gegebene Bedingung erfüllt ist. Die Bedingung wird vor jedem Durchlauf geprüft; bei Abbruch wird mit der auf „endwhile“ folgenden Anweisung fortgefahren. Wenn die Bedingung schon vor dem ersten Durchlauf nicht erfüllt ist, werden die Anweisungen im Rumpf folglich überhaupt nicht ausgeführt.

Postkonditionale Schleife

Wenn die „break()“-Anweisung dem Schleifenfuß unmittelbar vorangeht, hat man eine postkonditionale Schleife formuliert. Auch für diesen Spezialfall gibt es ein Konstrukt, bei dem der Schleifenfuß die Abbruchbedingung aufnimmt:

repeat
  # Schleifenrumpf mit Anweisungen
until( <boolean expression> )
Die Anweisungen im Rumpf werden ausgeführt, bis die durch den Booleschen Ausdruck gegebene Bedingung erfüllt ist. Die Bedingung wird nach jedem Durchlauf geprüft; bei Abbruch wird mit der auf „until“ folgenden Anweisung fortgefahren. Die Anweisungen im Rumpf werden also in jedem Falle einmal ausgeführt.

Es ist möglich, wenn auch aus Gründen der Übersicht und der Effizienz nicht empfehlenswert, den „while()“-Kopf mit dem „until()“-Fuß in einer Schleife zu kombinieren.

Zählschleife

Die Zählschleife dient dem häufig anzutreffenden Spezialfall, in dem sich die Zahl der Iterationen durch Ausdrücke angeben lässt. Die „For“-Schleife

for( <loopvar>, <expression_start>, <expression_end>, <expression_step> )
  # Schleifenrumpf mit Anweisungen
endfor

wiederholt die Anweisungen in ihrem Rumpf solange, bis der in der Schleifenvariablen <loopvar> gespeicherte Wert den Wert des Ausdrucks <expression_end> erreicht oder überschreitet. Vor dem ersten Durchlauf wird der Schleifenvariablen der Wert des Ausdrucks <expression_start> (Startwert) zugewiesen. Nach jeder Iteration wird die Schleifenvariable um den Wert des Ausdrucks <expression_step> (Schrittweite) erhöht; ohne Angabe der Schrittweite wird nach jeder Iteration um 1 erhöht.

Eine derartige Schleife ließe sich auch mit den anderen Schleifen darstellen. Die For-Schleife ist aber in der Ausführung effizienter, weil der Schleifenkopf die Zählvariable auszeichnet und es dem Interpreter ermöglicht, sie für die Dauer der Iterationen für einen beschleunigten Zugriff vorzuhalten. Die Ausdrücke im Schleifenkopf werden nur vor dem ersten Durchlauf einmal berechnet.