Использование совместных подпрограмм Lua в реальном мире / continue serialization для упрощения асинхронной логики?

Библиотека 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, использующих свои функции таким образом, используя продолжения для упрощения логики в асинхронной среде?

5
задан Lilith River 8 March 2011 в 15:27
поделиться