Справочное руководство Lua 5.1 гласит, что итератор
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
Почему Lua требует переменную 'state', s ?
Я бы предположил, что это означает, что функции итератора не нужно переносить какое-либо состояние для каждого итератора (см., например, схему ipairs , приводящую к итераторамфункции), однако довольно просто создать замыкания по требованию, которые переносят это состояние, а стоимость составляет почти один раз за итерацию, случай на основе эффективности мне не так понятен.