如何使用 lua c api 创建 lua 协程?
How to create lua coroutines using the lua c api?
如何使用 lua c api 创建 lua 协程并将其公开给 lua?
我正在用 c 为 lua 编写一个库,我想知道如何使用 lua c api 实现 lua 协程。我基本上想实现类似下面的东西,其中模块是用 c 编程语言编写的。
module = require("mymodule")
coroutine.resume(module.coroutine_function, ...)
以下是C代码生成字符串“Wonderfull”4次。并且 return 在终止协程之前是字符串“End”。
static int kfunction(lua_State* L, int status, lua_KContext ctx)
{
static int x = 0;
if (x < 3)
{
x++;
lua_pushfstring(L, "Wonderfull");
return lua_yieldk(L, 1, 0, kfunction);
}
lua_pushfstring(L, "End");
return 1;
}
static int iter(lua_State* L)
{
lua_pushfstring(L, "Wonderfull");
return lua_yieldk(L, 1, 0, kfunction);
}
int luaopen_module(lua_State* L) {
// initial function which is called when require("module") is run
lua_State* n = lua_newthread(L);
lua_setglobal(L, "coroutine_function");
lua_pushcfunction(n, iter);
return 0;
}
使用Lua中的C模块:
require("module")
print(coroutine.resume(coroutine_function)) -- true Wonderfull
print(coroutine.resume(coroutine_function)) -- true Wonderfull
print(coroutine.resume(coroutine_function)) -- true Wonderfull
print(coroutine.resume(coroutine_function)) -- true Wonderfull
print(coroutine.resume(coroutine_function)) -- true End
print(coroutine.resume(coroutine_function)) -- false cannot resume dead coroutine
int iter(lua_State* L)
在第一次调用coroutine.resume
时被调用。随后的调用是 int kfunction(lua_State* L, int status, lua_KContext ctx)
.
lua_yieldk
的第 4 个参数可以是完整的,因为下一个函数 Lua 应该调用以获得下一个产量或 return 值。
如何使用 lua c api 创建 lua 协程并将其公开给 lua?
我正在用 c 为 lua 编写一个库,我想知道如何使用 lua c api 实现 lua 协程。我基本上想实现类似下面的东西,其中模块是用 c 编程语言编写的。
module = require("mymodule")
coroutine.resume(module.coroutine_function, ...)
以下是C代码生成字符串“Wonderfull”4次。并且 return 在终止协程之前是字符串“End”。
static int kfunction(lua_State* L, int status, lua_KContext ctx)
{
static int x = 0;
if (x < 3)
{
x++;
lua_pushfstring(L, "Wonderfull");
return lua_yieldk(L, 1, 0, kfunction);
}
lua_pushfstring(L, "End");
return 1;
}
static int iter(lua_State* L)
{
lua_pushfstring(L, "Wonderfull");
return lua_yieldk(L, 1, 0, kfunction);
}
int luaopen_module(lua_State* L) {
// initial function which is called when require("module") is run
lua_State* n = lua_newthread(L);
lua_setglobal(L, "coroutine_function");
lua_pushcfunction(n, iter);
return 0;
}
使用Lua中的C模块:
require("module")
print(coroutine.resume(coroutine_function)) -- true Wonderfull
print(coroutine.resume(coroutine_function)) -- true Wonderfull
print(coroutine.resume(coroutine_function)) -- true Wonderfull
print(coroutine.resume(coroutine_function)) -- true Wonderfull
print(coroutine.resume(coroutine_function)) -- true End
print(coroutine.resume(coroutine_function)) -- false cannot resume dead coroutine
int iter(lua_State* L)
在第一次调用coroutine.resume
时被调用。随后的调用是 int kfunction(lua_State* L, int status, lua_KContext ctx)
.
lua_yieldk
的第 4 个参数可以是完整的,因为下一个函数 Lua 应该调用以获得下一个产量或 return 值。