2012-11-18 12 views
5

Lua jest dostarczane z bezpłatną wersją reference manual dla wersji 5.2 (której używam) i Programming in Lua dla wersji 5.0.Osadzanie Lua 5.2 i definiowanie bibliotek

Było jednak kilka zmian między tymi wersjami, których nie mogę przekroczyć. Zmiany są odnotowywane w kolejnych wersjach podręcznika referencyjnego dla 5.2 i 5.1. Zwróć uwagę na kolejne wycofanie luaL_openlib() na rzecz luaL_register(), następnie luaL_register() na rzecz luaL_setfuncs().

Poszukiwania w Internecie dają mieszane wyniki, z których większość wskazuje na luaL_register().

Co staram się osiągnąć można podsumować przez miniprogramów poniżej, które mogą być zestawiane i łączone z powiedzmy 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; 
} 

To działa zgodnie z oczekiwaniami i wpisując t1() daje oczekiwanego rezultatu.

Chciałbym teraz stworzyć bibliotekę/paczkę widoczną dla Lua. W Programming in Lua porady nas to use tablicę i funkcją obciążenia:

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

następnie użyć luaopen_tlib() po luaL_openlibs(). Dzięki temu możemy użyć tlib:t2(), jeśli zdefiniujemy LUA_COMPAT_MODULE (praca w trybie zgodności).

Jaki jest właściwy sposób postępowania w Lua 5.2?

Odpowiedz

8

Funkcja luaopen_tlib powinien być napisany w ten sposób:

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

I w funkcji main, należy załadować moduł tak:

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

Lub alternatywnie, można dodać wpis {"tlib", luaopen_tlib} do tabeli loadedlibs w linit.c.

+0

LuaL_openlibs jest opcjonalne i prawdopodobnie nie powinno tam być (na przykład). – Cubic

+0

Edytowałem przykład, tak aby pokazywał się tylko ważny wiersz. – prapin