CからLua: Luaのスクリプトファイルを実行
CのプログラムからLuaのスクリプトファイルを実行してみます。
luaL_loadfile()を使ってLuaのスクリプトファイルを読み込み、lua_pcallで実行します。
// lua_load_script.c // Luaのスクリプトファイルを読み込み、実行する #include <stdio.h> #include "lua.h" #include "lualib.h" #include "lauxlib.h" int main(int argc, char *argv[]) { lua_State *L; // 開始処理 L = lua_open(); luaL_openlibs(L); // 実行するLuaスクリプトをロード if (luaL_loadfile(L, argv[1])) { fprintf(stderr, "luaL_loadfile()でエラー.\n"); return -1; } // ロードされている関数を実行 if (lua_pcall(L, 0, LUA_MULTRET, 0)) { fprintf(stderr, "lua_pcall()でエラー.\n"); return -1; } // 終了処理 lua_close(L); return 0; }
で、これをコンパイル&実行。実行時に指定したスクリプトを実行します。
(環境はmsysで、Luaのヘッダファイルへのインクルードパスが通っていること、liblua.aへのライブラリパスが通っていることを前提としてます)
~:$ gcc lua_load_script.c -llua ~:$ ./a.exe src/lua-5.1.3/test/hello.lua Hello world, from Lua 5.1!
できたできた。
ちなみに、luaL_loadfile()にはLuaのバイトコードのファイルを渡してもちゃんとロードしてくれます。実際、下記のようにして、コンパイル後のバイトコードを渡しても同じ結果が得られることが確認できます。
~:$ luac src/lua-5.1.3/test/hello.lua ~:$ ./a.exe luac.out Hello world, from Lua 5.1!
つまり、luaL_loadfile()では、コンパイル前のスクリプトファイルなのか、コンパイル後のバイトコードなのかを自動で判別してロードしてるってことですね。素晴らしい。