Библиотека Pluto для Lua утверждает, что может сериализовать совместные подпрограммы Lua. Я интерпретирую это как означающее «сериализуемые продолжения», что является важной функцией для обеспечения возможности записи асинхронного программирования в синхронном стиле.
Например, рабочий процесс может быть выражен линейно вместо того, чтобы требовать именованные точки входа
if (ask user is hungry) then
if (not ask user is vegetarian) then
if (ask user if likes_burgers) then
feed_user(burger)
else
tell_user("Picky!")
else
feed_user(salad)
вместо
function main()
ask(user is hungry, "hungry_response")
function hungry_response(answer)
if (answer is yes)
ask(user is vegetarian, "vegetarian_response")
function vegetarian_response(answer)
if (answer is yes)
feed_user(salad)
else
ask(user likes burgers, "burgers_response")
function burgers_response(answer)
if (answer is yes) then
feed_user(burger)
else
tell_user("Picky!")
] Хотя операторы if, переведенные в предыдущий стиль, неплохи, все становится очень сложным, если вы задействуете локальные переменные, циклы, вызовы вложенных функций и т. Д.
Именно здесь сериализуемые продолжения становятся критически важными.
Сериализованные продолжения используются в JavaFlow, Cocoon (Rhink), Seaside, PLT Scheme, SICS, и отлично подходят для бизнес-процессов, медицинской диагностики и (в моем случае) текстовых приключенческих игр.
Есть ли какие-нибудь примеры (надеюсь, с открытым исходным кодом!) Lua и Pluto, использующих свои функции таким образом, используя продолжения для упрощения логики в асинхронной среде?