LuaとCは互いに呼び出し合う


詳細
 
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