Lua协程/延续序列化在现实世界中的使用,以简化异步逻辑?

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)、海滨、PLT Scheme、SICS,非常适用于处理业务工作流、医学诊断,以及(在我这种情况下)文本冒险游戏。

有没有任何例子(最好是开源的!)使用Lua和Pluto以这种方式利用它们的功能,使用续延来简化异步环境中的逻辑?

原文链接 https://stackoverflow.com/questions/5234514

点赞
stackoverflow用户44811
stackoverflow用户44811

以下是来自 WKP(“一个众所周知的程序员”)的 Tir 例子。它简化了异步操作,如果不是序列化,就是微型 BSD 许可的 Web 框架,使用 Lua 协同程序。

从博客中...

让这个工作的魔法是 Lua 的协同程序。在我们调用 web:prompt 和 web:click 的每个点上,Tir 引擎都会中断我们的 handler, 并将它保存起来以备将来使用,然后新的请求将它带回来。 这个代码基本上是这样的:

function Web:recv()
    return coroutine.yield()
end
2011-03-17 22:17:35