5

LuaPluto 库声称能够序列化 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 以这种方式利用它们的功能的示例(希望是开源的!),使用延续来简化异步环境中的逻辑?

4

1 回答 1

3

http://sheddingbikes.com/posts/1289384533.html

http://dpaste.de/Huj4/

例如,查看来自 WKP(“知名程序员”)的 Tir。它简化了(如果不是序列化的话)异步操作。它是一个使用 Lua 协程的 BSD 许可的微型 Web 框架。

从博客...

使这项工作的魔力是 Lua 的协程。在我们调用 web:prompt 和 web:click 的每个点上,Tir 引擎都会生成我们的处理程序,将其保存以备后用,然后一个新的请求将其返回。执行此操作的代码基本上是:

function Web:recv()
    return coroutine.yield()
end
于 2011-03-17T22:17:35.120 回答