Browsed by
Tag: lua

推荐一个lua的小插件

推荐一个lua的小插件

以前一直用Geany编辑器编写Lua程序。其实这个工具很垃圾,只是别的工具更垃圾。要求也不高,无非就是变量、函数等跳转、列表,工程范围内查找,基本的编辑功能即可,不要求调试功能。

平时写脚本一般都是采用visual studio code,很棒的工具,就简单编辑功能而言,vsc 做得相当好。因此也试图尝试 vsc 的插件,看看能否满足上述编写Lua脚本的要求。

看到 vsc 推荐作者sumneko 的插件,名字居然就叫 Lua,如下图所示。简单试了一下,感觉不错,符合上述各项需求,值得推荐。

Lua 插件
Lua 插件
C向Lua函数传递table参数

C向Lua函数传递table参数

有时需要向函数传递相对比较复杂的数据,定义多个形参显得很难看,C语言函数中通常传递一个数据结构,而对于lua最直接的莫过于传递一个table数据。C调用lua函数时,也可以通过构造table数据传递给lua函数。

基本步骤比较简单,大致是(1)获取lua函数(2)在栈中构造一个table(3)向table中压入相应的数据(key-value)(4)执行lua函数。

以下伪码详细描述了这个过程:

......
lua_getglobal(L, "demoFunc"); // 获取Lua函数名

lua_newtable(L); // 创建一个table
lua_pushstring(L, "intVal");  //key为intVal
lua_pushinteger(L,1234);      //值为1234
lua_settable(L, -3);          //写入table
lua_pushstring(L, "strVal");  //key为strVal
lua_pushstring(L, "yxh");     //值为yxh
lua_settable(L, -3);          //写入table

lua_pcall(L,1,0,0); // 调用demoFunc函数
......
luaL_loadfile的坑

luaL_loadfile的坑

在众多demo中,都是使用这个函数加载lua文件,然后由C程序调用lua提供的function或者value。但是调用该函数后,如果直接使用lua_getglobal去获取对应的lua函数,只会获取到空值。

luaL_loadfile实际调用了lua_load函数来加载lua文件。需要注意的是:lua_load仅加载lua代码块,但是并不运行。如果成功,会加载一个编译好的代码块作为一个匿名函数放置在栈顶。只有首先执行这个代码块,lua的vm才能最终知道各函数、变量等信息。

调用luaL_loadfile之后,应当接着调用lua_pcall执行匿名代码块,后续C代码才能有效调用Lua的函数。这样显然是比较繁琐的,lua中又提供了luaL_dofile宏来封装这两步过程:(1)加载;(2)执行。

因此,一般情况下,应该使用luaL_dofile来替代luaL_loadfile。

Lua的真

Lua的真

居然将0和空字符串也视为“真”!学了这么多种语言,第一次遇到将0判真的情况。

而且数组下标默认从1开始!好吧,印象中Fortran似乎也是这么处理。

大家的精力真是无限,毫无意义地浪费在这些繁琐的细节上。