Pluto library 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语句转换为前一个样式并不坏,但是一旦涉及局部变量,循环,嵌套函数调用等,事情就变得非常复杂。
这是序列化延续变得至关重要的地方。
Serialized continuations用于JavaFlow,Cocoon(Rhink),Seaside,PLT Scheme,SICS,非常适合处理业务工作流程,医疗诊断和(在我的情况下)文本冒险游戏。
是否有任何Lua和Pluto以这种方式利用其功能的示例(希望是开源!),使用continuation来简化异步环境中的逻辑?
答案 0 :(得分:3)
http://sheddingbikes.com/posts/1289384533.html
例如,从WKP(“一个着名的程序员”)查看Tir。它简化了(如果不是序列化)异步操作。它是一个使用Lua协同程序的BSD许可的微型Web框架。
来自博客...
使这项工作变得神奇的是 Lua的协同程序。在每一个 我们称之为web的点:提示和 web:点击Tir引擎产生我们的 处理程序,将其保存以供日后使用 一个新的请求将它带回来。码 这样做基本上是:
function Web:recv() return coroutine.yield() end