从堆栈中获取闭包时如何使用 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 函数,这显然是一项相当昂贵的操作。