Подпрограммы


Подпрограммы создаются вызовом coroutine.create.
Единственным аргументом является имя главной функции подпрограммы.
Функция create только создает новую подпрограмму и возвращает указатель
на нее (объект типа thread), запуск подпрограммы не выполняется.

При вызове функции coroutine.resume и передаче ей в качестве первого
аргумента результата вызова coroutine.create, процедура запускается
на выполнение с первого оператора ее главной функции. Остальные параметры
из вызова coroutine.resume передаются в основную функцию подпрограммы.

После запуска подпрограмма выполняется до завершения либо до вызова yields.
Для приостановки выполнения попрограммы используется функция coroutine.yield
Функция coroutine.wrap создает подпрограмму и осуществляет ее запуск.

co = coroutine.create(function(a,b)
    print(a,b)
    coroutine.yield(3,4)
    return a+10
end )

print(coroutine.resume(co,1,2))
print(coroutine.resume(co,1,2))

1     2
true  3   4
true  11

-- Создает новую подпрограмму, с телом f
coroutine.create(f)

-- Возвращает выполняемую подпрограмму (или nil в главной нити)
coroutine.running()

-- "running" (выполняется), "suspended" (приостановалена),
-- "normal" (норма) если подпрограмма активна, но еще не запущена на выполнение,
-- "dead" (остановлена) если подпрограмма завершилась
coroutine.status(co)

coroutine.wrap(f)
coroutine.yield(···)