2012-11-18 14 views
5

Luaは、私が使用しているバージョン5.2用の無料のreference manualと、バージョン5.0用のProgramming in Luaも用意されています。Lua 5.2の埋め込みとライブラリの定義

しかし、私はこれらのバージョン間でいくつかの変更がありましたが、私はそれを上回ることはできないようです。この変更は、5.2および5.1のリファレンスマニュアルの逐次バージョンに記載されています。 luaL_openlib()の引き続く非推奨がluaL_register()を支持し、次にluaL_register()luaL_setfuncs()を支持することに注意してください。

ウェブ上の検索結果が混在していて、ほとんどがluaL_register()を指しています。発言してコンパイルとリンクさせることができる私は何を達成しようとするその下のミニプログラムによって要約することができる

gcc ./main.c -llua -ldl -lm -o lua_test

#include <lua.h> 
#include <lauxlib.h> 
#include <lualib.h> 

#include <stdio.h> 
#include <string.h> 


static int test_fun_1(lua_State * L) 
{ 
    printf("t1 function fired\n"); 
    return 0; 
} 

int main (void) 
{ 
    char buff[256]; 
    lua_State * L; 
    int error; 

    printf("Test starts.\n\n"); 

    L = luaL_newstate(); 
    luaL_openlibs(L); 

    lua_register(L, "t1", test_fun_1); 

    while (fgets(buff, sizeof(buff), stdin) != NULL) 
    { 
     if (strcmp(buff, "q\n") == 0) 
     { 
      break; 
     } 
     error = luaL_loadbuffer(L, buff, strlen(buff), "line") || 
       lua_pcall(L, 0, 0, 0); 
     if (error) 
     { 
     printf("Test error: %s\n", lua_tostring(L, -1)); 
     lua_pop(L, 1); 
     } 
    } 
    lua_close(L); 

    printf("\n\nTest ended.\n"); 
    return 0; 
} 

これは期待どおりに動作してt1()を入力すると予想される結果が得られます。

私は今、Luaに見えるライブラリ/パッケージを作成したいと思います。 Programming in Lua アドバイス私たちto useアレイと負荷機能:

static int test_fun_2(lua_State * L) 
{ 
    printf("t2 function fired\n"); 
    return 0; 
} 

static const struct luaL_Reg tlib_funcs [] = 
{ 
    { "t2", test_fun_2 }, 
    { NULL, NULL } /* sentinel */ 
}; 

int luaopen_tlib (lua_State * L) 
{ 
    luaL_openlib(L, "tlib", tlib_funcs, 0); 

    return 1; 
} 

その後、luaL_openlibs()luaopen_tlib()を使用しています。これにより、LUA_COMPAT_MODULE(互換モードで動作する)を定義した場合、tlib:t2()を使用することができます。

Lua 5.2でこれを行う正しい方法は何ですか?

答えて

8

luaopen_tlib機能は、そのように記述する必要があります。

int luaopen_tlib (lua_State * L) 
{ 
    luaL_newlib(L, tlib_funcs); 
    return 1; 
} 

をそしてmain機能で、あなたはこのようにモジュールをロードする必要があります

int main (void) 
{ 
    // ... 
    luaL_requiref(L, "tlib", luaopen_tlib, 1); 
    // ... 
} 

または代わりに、あなたは、エントリを追加することができます{"tlib", luaopen_tlib}linit.cloadedlibsテーブルに移動します。

+0

luaL_openlibsはオプションであり、存在しないはずです(例)。 – Cubic

+0

重要な行だけが表示されるように例を編集しました。 – prapin

関連する問題