Lua 的标准命令行解释器就是这样一个程序的一个例子。在 Windows 上,它是一个链接到lua52.dll
. 当然,它的来源是Lua 发行版的一部分。
尽管与 Lua DLL 的源代码位于同一文件夹中,但它lua.c
仅引用 Lua 的公共 API,并且仅依赖于四个公共头文件和 DLL 本身。
下面是一个在 C 程序中嵌入 Lua 解释器的更简单的示例,它源自在线提供的 PiL 书中的示例:
#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int main (void) {
char buff[256];
int error;
lua_State *L = luaL_newstate(); /* create state */
luaL_openlibs(L); /* open standard libraries */
while (fgets(buff, sizeof(buff), stdin) != NULL) {
error = luaL_loadbuffer(L, buff, strlen(buff), "line") ||
lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1); /* pop error message from the stack */
}
}
lua_close(L);
return 0;
}
在您现有的应用程序中,您需要调用luaL_newstate()
一次并存储返回的句柄。除了调用 之外luaL_openlibs()
,您还可能希望定义一个或多个 Lua 模块来表示您的应用程序的可编写脚本的 API。当然,您需要lua_close()
在退出之前调用某个时间,以便 Lua 有机会清理其对象,特别是有机会处理脚本作者依赖的任何对象,以便在应用程序退出时释放资源。
有了这些,您通常会提供一种方法来加载用户提供的脚本片段,luaL_loadbuffer()
或者使用构建在lua_load()
. 加载脚本会对其进行编译,并在堆栈顶部留下一个匿名函数,该函数在调用时将执行脚本中的所有顶级语句。
有关这方面的更多讨论,请参阅与 C API 相关的 Lua 编程章节(可在线获得较旧的补充)。