具有自定义 API 和 Lua 自定义的嵌入式 Lua 解释器
演示如何在 C 代码中嵌入 lua 解释器,将 C 定义的函数暴露给 Lua 脚本,评估 Lua 脚本,从 Lua 调用 C 定义的函数,以及从 C(主机)调用 Lua 定义的函数。
在这个例子中,我们希望通过 Lua 脚本设置心情。这是 mood.lua:
-- Get version information from host
major, minor, build = hostgetversion()
print( "The host version is ", major, minor, build)
print("The Lua interpreter version is ", _VERSION)
-- Define a function for host to call
function mood( b )
-- return a mood conditional on parameter
if (b and major > 0) then
return 'mood-happy'
elseif (major == 0) then
return 'mood-confused'
else
return 'mood-sad'
end
end
请注意,脚本中未调用 mood()
。它只是为主机应用程序定义来调用。另请注意,脚本调用了一个名为 hostgetversion()
的函数,该函数未在脚本中定义。
接下来,我们定义一个使用’mood.lua’的宿主应用程序。这是’hostlua.c’:
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
/*
* define a function that returns version information to lua scripts
*/
static int hostgetversion(lua_State *l)
{
/* Push the return values */
lua_pushnumber(l, 0);
lua_pushnumber(l, 99);
lua_pushnumber(l, 32);
/* Return the count of return values */
return 3;
}
int main (void)
{
lua_State *l = luaL_newstate();
luaL_openlibs(l);
/* register host API for script */
lua_register(l, "hostgetversion", hostgetversion);
/* load script */
luaL_dofile(l, "mood.lua");
/* call mood() provided by script */
lua_getglobal(l, "mood");
lua_pushboolean(l, 1);
lua_call(l, 1, 1);
/* print the mood */
printf("The mood is %s\n", lua_tostring(l, -1));
lua_pop(l, 1);
lua_close(l);
return 0;
}
这是输出:
The host version is 0 99 32
Lua interpreter version is Lua 5.2
The mood is mood-confused
即使在我们编译’hostlua.c’之后,我们仍然可以自由修改’mood.lua’来改变我们程序的输出!