2.4.5 FOR-Anweisung Korrektur einreichen Original anzeigen

Die for-Anweisung hat zwei Formen: Eine numerische und eine generische.

Die numerische for-Schleife wiederholt einen Code-Block, während eine Laufvariable eine arithmetische Folge durchläuft. Sie hat folgende Syntax:

stat ::= for Name `=´ exp `,´ exp [`,´ exp] do block end

block wird für Name beginnend beim Wert des ersten exp wiederholt, bis es mit der Schrittweite des dritten exp das zweite exp erreicht. Genauer gesagt ist eine for-Anweisung wie …

for v = e1, e2, e3 do block end

… äquivalent zu …

do
  local var, limit, step = tonumber(e1), tonumber(e2), tonumber(e3)
  if not (var and limit and step) then error() end
  while (step > 0 and var <= limit) or (step <= 0 and var >= limit) do
    local v = var
    block
    var = var + step
  end
end

Beachten Sie Folgendes:

  • Alle drei Ausdrücke zur Steuerung werden lediglich einmal ausgewertet, bevor die Schleife beginnt. Sie müssen alle in einer Zahl resultieren.
  • var, limit und step sind unsichtbare Variablen. Die Bezeichner dienen hier lediglich Erklärungszwecken.
  • Falls kein dritter Ausdruck (die Schrittweite) angegeben wird, wird eine Schrittweite von 1 benutzt.
  • Sie können break benutzen, um eine for-Schleife zu verlassen.
  • Die Schleifenvariable v ist lokal für die Schleife; Sie können deren Wert nach Beendigung oder Abbruch von for nicht verwenden. Falls Sie diesen Wert benötigen, weisen Sie ihn vor dem Abbruch oder der Beendigung der Schleife einer anderen Variable zu.

Die generische for-Anweisung arbeitet mit Funktionen, genannt Iteratoren. Nach jeder Iteration wird der Iterator aufgerufen, um einen neuen Wert zu erzeugen, bis der neue Wert nil ist. Die generische for-Schleife hat folgende Syntax:

stat ::= for namelist in explist do block end
namelist ::= Name {`,´ Name}

Eine for-Anweisung wie …

for var_1, ···, var_n in explist do block end

… ist äquivalent zu …

do
  local f, s, var = explist
  while true do
    local var_1, ···, var_n = f(s, var)
    var = var_1
    if var == nil then break end
    block
  end
end

Beachten Sie Folgendes:

  • explist wird lediglich einmal ausgewertet. Deren Ergebnisse sind ein Iterator, ein Status und ein Initialwert für die erste Iterator-Variable.
  • f, s und var sind unsichtbare Variablen. Die Bezeichner dienen hier lediglich Erklärungszwecken.
  • Sie können break benutzen, um eine for-Schleife zu verlassen.
  • Die Schleifenvariablen var_i sind lokal für die Schleife; Sie können deren Werte nach Beendigung von for nicht verwenden. Falls Sie diese Werte benötigen, weisen Sie sie vor dem Abbruch oder der Beendigung der Schleife einer anderen Variable zu.