5

El Pluto library para Lua afirma que puede serializar co-rutinas de Lua. Interpreto esto como el significado de "continuaciones serializables", que es una característica importante para hacer que la programación asincrónica sea escribible en un estilo sincrónico.¿Uso en el mundo real de las co-rutinas Lua/serialización de continuación para simplificar la lógica asíncrona?

Por ejemplo, un flujo de trabajo se puede expresar de forma lineal en lugar de exigir nombrado puntos de entrada

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) 

en lugar de

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!") 

Mientras que si las declaraciones se tradujo en el estilo anterior no son malas, las cosas se ponen muy complicado una vez que involucre variables locales, bucles, llamadas a funciones anidadas, etc.

Aquí es donde las continuaciones seriales se vuelven críticamente importante.

Serialized continuations se utilizan en JavaFlow, Cocoon (Rhink), Seaside, PLT Scheme, SICS, y son ideales para hacer frente a flujos de trabajo empresariales, diagnósticos médicos y (en mi caso), juegos de aventuras textuales.

¿Hay algún ejemplo (esperemos que sea de código abierto) de Lua y Pluto aprovechando sus funciones de esta manera, utilizando las continuas para simplificar la lógica en un entorno asíncrono?

Respuesta

3

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

http://dpaste.de/Huj4/

Para ejemplos, visita Tir de una wkp ("un programador conocido"). Simplifica, si no serializa, las operaciones de sincronización. Es un framework micro web con licencia BSD que usa corutinas Lua.

Desde el blog ...

La magia que hace que este trabajo es corrutinas de Lua. En cada uno de los puntos donde llamamos a web: prompt y web: haga clic en el motor Tir produce nuestro controlador , guárdelo para más adelante y luego lo trae una nueva solicitud. Código que hace esto es básicamente:

function Web:recv() 
    return coroutine.yield() 
end 
+0

Gracias, yo no había oído hablar de Tir antes! –

Cuestiones relacionadas