LuaとCは互いに呼び出し合う
詳細
LuaはCとのインタラクションに強力なAPIを提供し,両者の値間の伝達は仮想スタックによって実現される.
一.Luaインタプリタの実装
上記の少量のコードはlua解釈器を実現し,印刷hello worldを実行する.
二.C呼び出しLua関数
2.1 Lua関数実装
2.2 Lua関数の呼び出し
実行結果:
三.Lua呼び出しC
3.1 Lua呼び出しコード
3.2 C平均実現
実行結果:
パラメータリンク:
http://www.lua.org/manual/5.3/manual.html
http://www.jb51.net/article/72661.htm
LuaはCとのインタラクションに強力なAPIを提供し,両者の値間の伝達は仮想スタックによって実現される.
一.Luaインタプリタの実装
/**
* Lua
*/
int main( int argc, char **argv )
{
//
lua_State *pl = luaL_newstate();
// , io,os,math
luaL_openlibs( pl );
// lua
luaL_dofile( pl, "./hello.lua" );
lua_close( pl );
return 0;
}
上記の少量のコードはlua解釈器を実現し,印刷hello worldを実行する.
二.C呼び出しLua関数
2.1 Lua関数実装
-- add
function add( x, y )
return x + y
end
2.2 Lua関数の呼び出し
/**
* lua
*
*/
int luaadd( lua_State *l, int x, int y )
{
// lua add()
lua_getglobal( l, "add" );
// x
lua_pushnumber( l, x );
// y
lua_pushnumber( l, y );
// ,nargs=2,nresults=1
lua_call( l, 2, 1 );
// ( )
int sum = (int)lua_tointeger( l, -1 );
//
lua_setglobal( l, "add );
return sum;
}
/**
* C lua
*
*/
int Calllua_test()
{
// init
lua_State *l = luaL_newstate();
luaL_openlibs( l );
// lua
luaL_dofile( l, "./add.lua" );
// lua add()
int sum = luaadd( l, 10, 15 );
printf( "Lua add: %d
", sum );
lua_close( l );
return 0;
}
実行結果:
Lua add: 25
三.Lua呼び出しC
3.1 Lua呼び出しコード
-- average
function main()
local avg, sum = average( 2, 2, 3, 5 )
print( "avg: ", avg )
print( "sum: ", sum )
end
main()
3.2 C平均実現
/**
*
*/
static int average( lua_State *l )
{
//
int n = lua_gettop( l );
double sum = 0;
int i = 0;
for( i=1; i<=n; i++ )
{
sum += lua_tonumber( l, i );
}
//
lua_pushnumber( l, sum/n );
//
lua_pushnumber( l, sum );
//
return 2;
}
/**
* Lua C
*
*/
int Callc_test()
{
// init
lua_State *l = luaL_newstate();
luaL_openlibs( l );
// register
lua_register( l, "average", average );
// do
luaL_dofile( l, "./avg.lua" );
lua_close( l );
return 0;
}
実行結果:
avg: 3.0
sum: 12.0
パラメータリンク:
http://www.lua.org/manual/5.3/manual.html
http://www.jb51.net/article/72661.htm