2009-08-15 18 views
4

私は現在、私が取り組んでいるアプリケーションの1つにLuaを実装しようとしています。現在、私はちょうどC APIを使用してlua_registerを使用して関数を登録していますが、静的でない関数ポインタを特定のクラスメソッドに渡すことができるようにしたいと考えています。Luaスクリプトの実装

私は、ネット上の特定のライブラリを見つけたが、私は全体的な機能はほとんど必要があるため、彼らはこれを行う簡単な方法がある場合、私は思っていた提供します。

ありがとうございます。

+0

実際にlua_registerにどのような問題がありますか?それはスタークとして宣言された関数の可視性ですか? –

答えて

4

A複雑なライブラリのAPIは、多くの場合、すぐにラップされると(ほぼ)完全にSWIGを使用することができます。この場合SWIGを使用する利点は、Lua、Perl、Python、Ruby、Javaなどの18 major languagesでライブラリを使用できるSWIGベースのラッパーを簡単に構築できることです。

Luaがあなたの好む(そして恐らく唯一の)懸念事項であるなら、私はluaL_register()を戦略の中核としてC言語で構築することを学ぶことを勧めます。このようにモジュールを構築する利点は、すべての機能をオーバーヘッドなしで単一の名前空間に配置できます。 Lua C関数呼び出し規約(lua_register()と同様)に一致するラッパー関数を作成し、スタックからLua引数を収集し、ラップされた関数を呼び出し、戻り値と出力パラメーターをルアスタック。これについての良い概説は、Programming in Luaの中で見つけることができます。初版のオンライン版では、Chapter 26のライブラリ作成について説明していますが、Lua 5.0用に書かれています。 Luaを使用してPiLの最新版のコピーを作成することを真剣にお勧めします。

残念ながら、Lua 5.1が5.0と最も異なる点の1つは、モジュールの動的ロード(CとLuaの両方)にrequireです。

は、ここでのLua 5.1で動作するCライブラリの完全な(小型の場合)の例です。エクスポートする必要が唯一の機能は名前がrequireで使用されるモジュールの名前に対応する必要があり、luaopen_sm()であることを特に

#include <lua.h> 
#include <luaxlib.h> 
#include <math.h> 
#undef PI 
#define PI (3.14159265358979323846) 

static int l_sin (lua_State *L) { 
    double r = luaL_checknumber(L,1); 
    lua_pushnumber(L, sin(r)); 
    return 1; 
} 

static int l_cos (lua_State *L) { 
    double r = luaL_checknumber(L,1); 
    lua_pushnumber(L, cos(r)); 
    return 1; 
} 

static const struct luaL_reg smlib [] = { 
    {"sin", l_sin}, 
    {"cos", l_cos}, 
    {NULL, NULL} /* sentinel */ 
}; 

int luaopen_sm (lua_State *L) { 
    luaL_openlib(L, "sm", smlib, 0); 
    lua_pushnumber(L,PI); 
    lua_rawset(L,-2,"pi"); 
    return 1; 
} 

注:私たちは、Cファイル内のラッパーの実装を開始します、およびDLLファイルの名前を指定します。そのファイルは、それはこのようなLuaのスクリプトでロードして使用することができます(おそらく、Unixライクなシステム上のlibsm.so命名)sm.dllという名前のDLLとしてコンパイルすると:

 
require "sm" 
print(sm.sin(sm.pi/3), sm.cos(sm.pi/3)); 

この例で、テストされていないものの、コンパイルすべきであり、走るほとんどの関数をmath.hから包括する完全な例については、Luaで配布されているsource to the math moduleを参照してください。これらの薄いラッパーには多くの反復コードが含まれているため、SWIGのようなツールは多くの場合、各関数の宣言だけを与えて作成することができます。

C++クラスのラッピング方法は原則的に似ています。それぞれのLua呼び出し可能ラッパー関数は、C++側でthisにマップできる引数を必要とします。また、モジュール静的関数または静的メンバー関数のいずれかで実装する必要があります。他の議論。 SWIGは、この種のラッパーを構築する際に特に優れており、途中でたくさんの細部が隠されています。

関連する問題