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