ジェネリックforのセマンティクス

PiL本に載っているが、一応書く。

for var_1, ..., var_n in <explist> do <block> end

これは以下のコードと等価。

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

_fはイテレータ関数、_sは不変状態、_varは制御変数。