代码之家  ›  专栏  ›  技术社区  ›  Miral

Lua代码的占位符评估

lua
  •  1
  • Miral  · 技术社区  · 16 年前

    我有一个应用程序,它使用Lua文件作为一些更模糊的配置选项。因此,它主要包含对应用程序的调用,以创建内容和更改属性;大多数C函数没有返回值,但有些函数有返回值。

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

    所以我想知道这里最好的方法是什么。如何(从C++应用程序),我可以加载和执行一个Lua脚本,使表达式等被评估为正常,但我可以拦截和处理某些应用程序定义的C函数,而忽略(如果需要返回NIL)调用任何其他C函数?

    (注意:我确实可以访问原始应用程序的词汇表,它主要使用Luabind;我可以使用相同的定义并更改实现,但这太脆弱了,因为原始应用程序以后可以添加更多的功能。我想要更普通的。)


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

    整个过程由一些C代码启动,这些代码设置了Lua环境,加载了一组文件,调用了一个函数,然后破坏了环境。不会有任何进展。

    3 回复  |  直到 16 年前
        1
  •  4
  •   lhf    16 年前

    为nil设置\调用元方法:

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

    g或其他表的索引元方法不起作用,因为名称已解析 之前 电话。

    (如果从C设置,则不需要使用调试API或库。)

        2
  •  3
  •   torus    16 年前

    使用怎么样 setfenv 和A metatable ?可以用空表替换某些函数的全局环境表。然后,将占位符函数设置为忽略C定义函数。

    local env = {}  -- empty environment
    local metatbl = {}
    function metatbl.__index (tbl, key)  -- provides placeholder function
        return function()
            print(key .. " called")
            return(nil)
        end
    end
    
    setmetatable(env, metatbl)
    
    function samplefunc()  -- your Lua code goes here
        globalfunction "xyz"   -- calls placeholder function
    end
    
    setfenv(samplefunc, env)
    samplefunc()
    

    如果要使用内置函数,例如 print ,您可以将其推入env talbe,如下所示:

    local env = {print = print}
    
        3
  •  0
  •   David Seiler    16 年前

    如果您有某种方法可以将C函数与脚本中的普通Lua函数区分开来,那么您可以迭代您的Lua系统中定义的所有函数,对于您关心的函数列表中没有的每个C函数,将该函数的实现替换为一个简单的零返回函数。如果所有的C绑定函数在一个表中被整齐地定义在一起,那么这非常容易;如果它们在 _G 你还有一点工作要做。你的功能 注意正常情况下通过luabind绑定。