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

と、うまくいきました。ホントもうダメかと思った。