5

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 スキーム、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 に答える