实际使用Lua协同例程/继续序列化来简化异步逻辑?

Lua的Pluto图书馆声称能够序列化Lua协同程序。我将其解释为'serializeable continuations',这是使异步编程以同步方式可写的重要特性。 例如,工作流可以线性表示,而不是需要命名的入口点
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以这种方式利用其功能的示例(希望是开源!),使用continuation来简化异步环境中的逻辑?     
已邀请:
http://sheddingbikes.com/posts/1289384533.html http://dpaste.de/Huj4/ 例如,从WKP(“一个着名的程序员”)查看Tir。它简化了(如果不是序列化)异步操作。它是一个使用Lua协同程序的BSD许可微Web框架。 来自博客......   使这项工作的神奇之处在于   Lua的协同程序。在每一个   我们称之为web的点:提示和   web:点击Tir引擎产生我们的   处理程序,将其保存以供日后使用   一个新的请求将它带回来。码   这样做基本上是这样的:
function Web:recv()
    return coroutine.yield()
end
    

要回复问题请先登录注册