Lua に手を出してみる
いざというときのために Lua を試してみました。バージョンは 5.1。
以下のスクリプトを C++ から呼び出すテストをしてみました。
f = function () print("hello") end
C++ 側のプログラムは以下のような感じ
int _tmain(int argc, _TCHAR* argv[]) { // LUA API の初期化 lua_State * luaState = lua_open(); // LUA スクリプトファイルの読み込み int result = luaL_loadfile(luaState, "hello.lua"); switch ( result ) { case 0: // チャンク本体を実行してテーブルに関数を積む result = lua_pcall(luaState, 0, 0, 0); if ( result ) { break; } lua_getfield(luaState, LUA_GLOBALSINDEX, "f"); result = lua_isfunction(luaState, -1); // チェック用 // LUA 関数呼び出し result = lua_pcall(luaState, 0, 0, 0); switch ( result ) { case LUA_ERRRUN: printf("実行時エラー。\n"); break; case LUA_ERRMEM: printf("メモリ確保エラー。\n"); break; case LUA_ERRERR: printf("エラーハンドラ関数内のエラー。\n"); break; } break; case LUA_ERRSYNTAX: printf("コンパイル中に構文エラーが発生\n"); break; case LUA_ERRMEM: printf("メモリ割り当てエラー\n"); break; } // LUA API の後始末 lua_close(luaState); return 0; }
lua インタプリタで実行したらちゃんと動くのになんでか実行時エラーが発生して難儀したのですが、関数呼び出しの後で
// LUA 関数呼び出し result = lua_pcall(luaState, 1, 1, 0); if ( result ) { printf("%s\n", lua_tostring(luaState,-1)); }
のようにしてみたらば、
hello.lua:2: attempt to call global 'print' (a nil value)
というエラー出力が帰ってきてました。標準機能である print がなんでか無効な値になっていたのですね。
何かしら準備が足りないようです。代わりに、
f = function (a) return "hello "..a end
lua_getfield(luaState, LUA_GLOBALSINDEX, "f"); result = lua_isfunction(luaState, -1); // チェック用 lua_pushstring(luaState, "lua"); // LUA 関数呼び出し result = lua_pcall(luaState, 1, 1, 0); printf("%s\n", lua_tostring(luaState,-1));
としてみたら、
hello lua
と、うまくいきました。ホントもうダメかと思った。