luaで、luaの関数を呼ぶC++の関数をluaから呼んでみた

引数2個、戻り値1個のlua関数を引数にとり、
実行されると与えられた引数の関数に5,15を入れて呼び出し、
得られた戻り値を2倍したものを返り値とするlua関数をC++で作成しました。

大変ややこしいですが、C++ => LUAの呼び出し、 LUA => C++ の呼び出しを
まとめて書ける豪華?なサンプル、ということで試しに作ってみました。

試した環境は LuaJIT-2.0.0、Visual Studio 2008です。

lua
print('callfunc:' ..
callfunc(
function(a, b)
print('Hello');
print('a=' .. a);
print('b=' .. b);
return a + b;
end
)
);

C++
#include <cstdio>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

int l_callfunc(lua_State *L){
luaL_checktype(L, -1, LUA_TFUNCTION);

lua_pushnumber(L, 5); // 第一引数
lua_pushnumber(L, 15); // 第二引数
lua_pcall(L, 2, 1, 0); // 引数2つ、戻り値1つとして積まれている関数を呼ぶ

double result = lua_tonumber(L, -1);
printf("result:%f\n", result);
lua_pop(L, 1);
lua_pushnumber(L, result * 2);
return 1; // 戻り値の数
}

int main(int argc, char *argv[]){
if (argc < 2) return 0;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "callfunc", l_callfunc);
if (luaL_loadfile(L, argv[1])){
printf("load失敗\n");
return 1;
}
if (lua_pcall(L, 0, 0, 0)){
printf("実行失敗\n");
return 1;
}else{
printf("最後の戻り値:%f\n", lua_tonumber(L, -1));
}
lua_close(L);
return 0;
}

結果
Hello
a=5
b=15
result:20.000000
callfunc:40
最後の戻り値:0.000000