扩展应用
Lua 的重要用于之一就是用作配置(configuration) 语言。
基础知识
假设我们的 C 程序有一个窗口,并希望用户能够指定窗口的初始大小。我们可以使用环境变量或使用基于键值对的配置文件。但即便是一个简单的文本文件,我们需要对其进行进行解析。因此,我们决定使用一个 Lua 配置文件。它可以包含如下简单内容:
width = 200
height = 300
现在,我们使用 Lua API 来指挥 Lua 语言来解析该文件,并获取全局变量 width 和 height 的值。
//从配置文件获取用户信息。
int getglobint(lua_State *L, const char *var) {
int isnum, result;
lua_getglobal(L, var);
result = (int)lua_tointegerx(L, -1, &isnum);
if (!isnum)
error(L, "'%s' should be a number\n", var);
lua_pop(L, 1);
return result;
}
void load(lua_State *L, const char *fname, int *w, int *h) {
if (luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0))
error(L, "cannot run config. file: %s", lua_tostring(L, -1));
*w = getglobint(L, "width");
*h = getglobint(L, "height");
}
该程序调用了两次辅助函数 getglobint. getglobint 首先调用函数 lua_getglobal 将相应的全局变量的值压入栈,lua_getglobal 只有一个参数(除了无所不在的 lua_State),就是变量名。然后 getglobint 调用函数 lua_tointegerx 将这个值转换为整型以保证其类型正确。
使用 Lua 来解析配置文件的好处有以下几点。首先,Lua 为我们处理了所有的语法细节,甚至配置文件都可以有注释!其次,用户还可以使用 Lua 来实现一些更复杂的配置。例如,脚本可以提示用户输入某些信息,或者查询环境变量来选择合适的窗口大小:
if getenv("DISPLAY") == ":0.0" then
width = 300; height = 300
else
width = 200; heihgt = 200;
最后一个使用 Lua 的理由是,使用它以后,向程序添加新的配置机制时会很方便。