具有自定義 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’來改變我們程式的輸出!