lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Hi,
I've been making some experimental implementation of
continuations in Lua as part of my PhD thesis. 

I have just made some preliminary tests and there are
some restrictions that are not my focus (at least, for the
time being). One of them is performance.
Another one is that our continuation involves only  the Lua stack,
so it doesn't capture stacks that cross Lua -> C -> Lua calls.
Another assumption is that the local variables remain in the stack, 
so when a continuation is called, it uses the same values which 
were on the stack when the continuation was created.

A continuation is created as a userdata and we used a syntax similar
to setjmp and longjmp functions:  getcont and callcont. 
The following example illustrates coroutines using continuations in Lua.

===
function a()
   write ("Starting A\n")
   co_a.transfer(co_b)
   write ("Back to A\n")
   co_a.transfer(co_b)
   write ("Finishing A\n")
   co_a.transfer(co_b)
end
 
function b()
   write ("   Starting B\n")
   co_b.transfer(co_c)
   write ("   Back to B\n")
   co_b.transfer(co_c)
   write ("   Finishing B\n")
   co_b.transfer(co_c)
end

function c()
   write ("      Starting C\n")
   co_c.transfer(co_a)
   write ("      Back to C\n")
   co_c.transfer(co_a)
   write ("      Finishing C\n")
   co_c.transfer(co_a)
end

function coroutine(f)
  self={}
  self.cont=nil
  self.func=f
  transfer = function(prala)
                local x = getcont() -- creates a continuation
                if x then
                   %self.cont=x
                   prala.resume()
                end
             end

  resume  =  function ()
                if (%self.cont==nil) then  -- if no continuation
                   %self.func()
                else
                   callcont(%self.cont)  -- call the target continuation
                end
             end
  return {transfer=transfer, resume=resume}
end  
  
co_a = coroutine(a)
co_b = coroutine(b)
co_c = coroutine(c)

co_a.resume() 

===

This current implementation of "Lua with continuations"
can be downloaded from: www.inf.puc-rio.br/~mjulia/luacc.tgz. 
Comments and contributions will be very much appreciated.

Regards,
--Julia