我希望能够编写如下这样的Lua代码:
y=x+1
并能够获取所有变量的名称(在这种情况下为x
和y
),这样我就可以在调用C ++程序中对它们进行读取/写入。问题在于x
未初始化,因此该块将不执行,因此两个变量都不会出现在globals表中。我当前的解决方法是让用户明确声明他们要在外部初始化x
(以及 how 进行初始化),然后在Lua脚本前添加一个x
的适当声明,以便最终脚本如下所示:
x= /*some value calculated outside of the Lua script*/
y=x+1
尽管这行得通,但我真的很想有一种方法可以自动在Lua代码中列出所有未初始化的变量并将其呈现给用户,而用户不必记住要明确声明它们。解析Lua代码而不执行它的函数可能就是我想要的。我已经尝试过函数luaL_loadstring
,但是x
和y
不在全局表中显示。
由于这有点含糊,因此我将给出一个实际的用例。我的C ++代码基本上对功能进行了优化,例如查找根或最大值。我希望用户能够定义自定义函数(以Lua脚本的形式),该函数通常将具有一个或多个输入以及一个或多个输出。用户将定义优化器应该对哪些参数进行操作。例如,用户可能希望找到y=x^2
的最小值。我希望它的工作方式是用户编写一个仅由y=x^2
组成的Lua脚本,然后告诉优化器改变x
以便最小化y
。在优化程序的每次迭代中,x
的当前猜测将自动粘贴到用户脚本中,然后执行该脚本,然后将y
的值从Lua状态中拉出以进行反馈给优化器。这就是我现在的工作方式,但是从UX角度来看这有点笨拙,因为用户必须手动声明x
是Lua变量。当有许多需要手动声明的变量时,这变得很乏味。如果我可以自动扫描脚本并向用户显示未声明变量的列表,这样他们可以使用拖放和其他GUI糖来进行手动声明,那就更好了。
答案 0 :(得分:3)
Lua不是要那样工作。 Lua / C互操作旨在实现协作;并不是说C可以做任何想做的事。
使用您的示例,如果您有一个Lua脚本,该脚本应该从C中获取一个值并返回该值+ 1,那么您可以在Lua中将其拼写如下:
local x = ... --Get the first parameter to the chunk.
return x + 1 --Adds 1 to the value and returns it.
您将此字符串编译为Lua块,并像Lua函数一样调用它。您将要处理的值传递给它,并从Lua堆栈中获取返回值。
不是的想法是C代码可以直接进入Lua脚本并将数据随意插入其中。上面的块从用户那里获取参数,并向用户提供返回值。通常,这就是C与Lua交互的方式。
是的,您可以将值写入全局变量,并让Lua脚本读取它们,然后将其“结果”写入外部代码读取的全局变量。但这不是与脚本交互的最有效方法。
我真的很想有一种自动列出所有未初始化变量的方法
Lua中没有“未初始化的变量”这样的东西。不是你的意思。
是的,有全局变量。但是,全局变量是否具有值不是Lua脚本可以控制的。毕竟,全局是 global ;您可以从脚本的外部设置全局变量(例如,参见lua_setglobal
)。如果这样做,从中读取的脚本将读取您设置的值。但是对此一无所知。
答案 1 :(得分:2)