所以我一直在尝试使用C绑定在nim中实现lua并且一切正常但除了我不知道如何处理传递给我的nim / c创建的procs / functions的lua函数
Lua代码:
task("custom_task", function()
task("This is called from lua")
end)
Nim proc:
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中使用它。任何帮助表示赞赏。
答案 0 :(得分:1)
lua_topointer
返回的值不能用于除了hasing或output / debugging之外的任何内容。引用Lua manual:
无法将指针转换回原始值。
通常,此函数仅用于散列和调试信息。
因此,如果您想使用lua函数,则必须找到不同的方法。我的建议是将函数存储在lua注册表中。然后可以通过注册表索引及其lua_State来识别该函数。
此方法的唯一问题是您必须记住从注册表中删除该功能。否则它永远不会被垃圾收集。
或者,可以lua_dump
这个功能,这显然是一个相当昂贵的操作。