Lua代码的占位符评估

我有一个应用程序,它使用lua文件来配置一些不常见的选项。因此,它主要包含调用应用程序来创建和修改属性的内容;大多数C函数都没有返回值,但有些有返回值。

现在我需要将这些相同的配置文件读取到另一个应用程序中,并在调用函数时执行显著不同的操作(因此我不能使用通用代码)。此外,我只对可能函数的子集感兴趣,并且我认为我可以通过默认忽略(和/或返回nil)任何其他函数调用来得以摆脱。

因此我想知道这里的最佳方法是什么。怎样(从C ++应用程序)可以加载和执行一个lua脚本,使表达式等按正常方式评估,但我可以拦截并处理特定的应用程序定义的C函数,同时仅忽略(如果需要返回nil)调用任何其他C函数?

(注意:我可以访问原始应用程序的词汇,它主要使用luabind;我可以只使用相同的定义并更改实现,但那太脆弱了,因为原始应用程序以后可以添加更多函数。我希望得到更通用的东西。)


目标是获得一小段C代码,我可以将其用作通用占位符。最终结果是“定义的任何内容(标准库例程,在Lua中定义的函数和显式注册的C函数),正常调用;对于任何其他内容,请调用一个特定的例程,而不是引发错误”。最好与luabind兼容。

整个过程由一小段C代码发起,设置Lua环境,加载一组文件,调用一个函数,然后销毁环境。不会有任何持续进行的事情。

原文链接 https://stackoverflow.com/questions/1597940

点赞
stackoverflow用户121674
stackoverflow用户121674

如果您有一些方式可以区分脚本中的 C 函数和普通的 Lua 函数,您可以迭代所有在 Lua 系统中定义的函数,并且对于每个不在您关心的函数列表中的 C 函数,将该函数的实现替换为简单的 nil 返回。如果所有的 C 绑定函数都整齐地定义在一个表中,这非常容易;如果它们在 _G 中,您需要做一些工作。您关心的函数可以像正常绑定一样通过 luabind 绑定。

2009-10-20 23:57:03
stackoverflow用户124820
stackoverflow用户124820

如何使用setfenvmetatable?你可以使用一个空表替换某个函数的全局环境表。然后,将占位符函数设置为忽略C定义的函数。

local env = {}  -- 空环境
local metatbl = {}
function metatbl.__index (tbl, key)  -- 提供占位符函数
    return function()
        print(key .. " called")
        return(nil)
    end
end

setmetatable(env, metatbl)

function samplefunc()  -- 你的Lua代码在这里
    globalfunction "xyz"   -- 调用占位符函数
end

setfenv(samplefunc, env)
samplefunc()

如果想使用内置函数,例如print,可以将其推入env表中,例如:

local env = {print = print}
2009-10-21 01:31:15
stackoverflow用户107090
stackoverflow用户107090

nil 设置一个 __call 元方法:

debug.setmetatable(nil, { __call=function () end })

对于 _G 或其他表的 _index 元方法不起作用,因为名称在调用之前被解析。

(如果您是从 C 设置这个方法,则无需使用 debug API 或库。)

2009-10-21 11:40:19