5

Luaにはバージョン5.2(私が使用している)用の無料のオンラインリファレンスマニュアルが付属しており、バージョン5.0用のLuaでのプログラミングも利用できます。

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

Webでの検索では、さまざまな結果が得られ、そのほとんどがを指してい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に表示されるライブラリ/パッケージを作成したいと思います。Luaのプログラミングでは、配列とロード関数を使用する ようにアドバイスしています。

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;
}

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

Lua 5.2でこれを行う適切な方法は何ですか?

4

1 に答える 1

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}を追加することもできます。loadedlibslinit.c

于 2012-11-18T19:50:22.537 に答える