1 Symmetric Coroutine
Lua支持asymmetric coroutine。對于symmetric coroutine,名為Coroutines in Lua的一篇論文,提供了如下的解決方案:
coro = {} coro.main = function() end coro.current = coro.main function coro.create(f) return coroutine.wrap(function(val) return nil, f(val) end) end function coro.transfer(k, val) if coro.current ~= coro.main then return coroutine.yield(k, val) else while k do coro.current = k if k == coro.main then return val end k, val = k(val) end error("coroutine ended without transfering control...") end end
代碼雖然不長,但是十分精致。通過yield/resume,以及一個dipatching循環,巧妙地實現了symmetric coroutine。此外在Revisiting Coroutines論文中,甚至用asymmetric coroutine實現了one-shot continuation。
2 Reference
Coroutines in Lua
Ana L´ucia de Moura , Noemi Rodriguez , Roberto Ierusalimschy
Revisiting Coroutines
Ana L´ucia de Moura and Roberto Ierusalimschy