如何在不运行Lua脚本的情况下识别未初始化的变量

时间:2018-12-17 17:43:58

标签: c++ lua

我希望能够编写如下这样的Lua代码:

y=x+1

并能够获取所有变量的名称(在这种情况下为xy),这样我就可以在调用C ++程序中对它们进行读取/写入。问题在于x未初始化,因此该块将不执行,因此两个变量都不会出现在globals表中。我当前的解决方法是让用户明确声明他们要在外部初始化x(以及 how 进行初始化),然后在Lua脚本前添加一个x的适当声明,以便最终脚本如下所示:

x= /*some value calculated outside of the Lua script*/
y=x+1

尽管这行得通,但我真的很想有一种方法可以自动在Lua代码中列出所有未初始化的变量并将其呈现给用户,而用户不必记住要明确声明它们。解析Lua代码而不执行它的函数可能就是我想要的。我已经尝试过函数luaL_loadstring,但是xy不在全局表中显示。

由于这有点含糊,因此我将给出一个实际的用例。我的C ++代码基本上对功能进行了优化,例如查找根或最大值。我希望用户能够定义自定义函数(以Lua脚本的形式),该函数通常将具有一个或多个输入以及一个或多个输出。用户将定义优化器应该对哪些参数进行操作。例如,用户可能希望找到y=x^2的最小值。我希望它的工作方式是用户编写一个仅由y=x^2组成的Lua脚本,然后告诉优化器改变x以便最小化y。在优化程序的每次迭代中,x的当前猜测将自动粘贴到用户脚本中,然后执行该脚本,然后将y的值从Lua状态中拉出以进行反馈给优化器。这就是我现在的工作方式,但是从UX角度来看这有点笨拙,因为用户必须手动声明x是Lua变量。当有许多需要手动声明的变量时,这变得很乏味。如果我可以自动扫描脚本并向用户显示未声明变量的列表,这样他们可以使用拖放和其他GUI糖来进行手动声明,那就更好了。

2 个答案:

答案 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)

您想要的是静态代码分析器/ Lua linter。看看Luacheck

  

Luacheck是静态分析器和Lua的linter。 Luacheck检测   各种问题,例如使用未定义的全局变量,未使用   变量和值,访问未初始化的变量,无法访问   代码等等。检查的大多数方面都是可配置的:   用于定义与项目相关的自定义全局变量的选项   标准全局变量(Lua标准库的版本),用于过滤   按类型和相关变量的名称等发出警告。这些选项可以   在命令行上使用,放入配置或直接放入   检查文件作为Lua注释。

还有LualintAtomVSCode或您最喜欢的IDE的类似Lua短绒。