从堆栈中获取闭包时如何使用 lua_topointer?
How do I use a lua_topointer when grabbing a closure from the stack?
所以我一直在尝试使用 C 绑定在 nim 内部实现 lua 并且一切正常,除了我不知道如何处理传递给我的 lua 函数 nim/c 创建了 procs/functions.
Lua代码:
task("custom_task", function()
task("This is called from lua")
end)
尼姆过程:
proc task*(state: lua.Pstate): cint {.cdecl.} =
var task_name : cstring
if lua.isstring(state, 1) == 1:
task_name = lua.tostring(state, cint(1))
if task_name != nil:
echo task_name
# this is triggered for the 2nd parameter
if lua.isfunction(state, 2) == true:
var test = lua.topointer(state, 2)
result = 1
所以 lua api 没有 tofunction
方法,只有 tocfunction
,所以似乎获取该函数的唯一方法是使用topointer,但我不知道如何在 nim 中使用它。感谢任何帮助。
lua_topointer
返回的值除了 hasing 或 output/debugging 之外不打算用于任何其他用途。引用 Lua manual:
There is no way to convert the pointer back to its original value.
Typically this function is used only for hashing and debug information.
因此,如果您想使用 lua 函数,则必须另辟蹊径。我的建议是将该函数存储在 lua 注册表中。然后可以通过注册表索引及其 lua_State.
来识别该函数
此方法的唯一问题是您必须记住从注册表中删除该函数。否则它永远不会被垃圾收集。
或者,可以 lua_dump
函数,这显然是一项相当昂贵的操作。
所以我一直在尝试使用 C 绑定在 nim 内部实现 lua 并且一切正常,除了我不知道如何处理传递给我的 lua 函数 nim/c 创建了 procs/functions.
Lua代码:
task("custom_task", function()
task("This is called from lua")
end)
尼姆过程:
proc task*(state: lua.Pstate): cint {.cdecl.} =
var task_name : cstring
if lua.isstring(state, 1) == 1:
task_name = lua.tostring(state, cint(1))
if task_name != nil:
echo task_name
# this is triggered for the 2nd parameter
if lua.isfunction(state, 2) == true:
var test = lua.topointer(state, 2)
result = 1
所以 lua api 没有 tofunction
方法,只有 tocfunction
,所以似乎获取该函数的唯一方法是使用topointer,但我不知道如何在 nim 中使用它。感谢任何帮助。
lua_topointer
返回的值除了 hasing 或 output/debugging 之外不打算用于任何其他用途。引用 Lua manual:
There is no way to convert the pointer back to its original value.
Typically this function is used only for hashing and debug information.
因此,如果您想使用 lua 函数,则必须另辟蹊径。我的建议是将该函数存储在 lua 注册表中。然后可以通过注册表索引及其 lua_State.
来识别该函数此方法的唯一问题是您必须记住从注册表中删除该函数。否则它永远不会被垃圾收集。
或者,可以 lua_dump
函数,这显然是一项相当昂贵的操作。