2012-11-18 3 views
5

Lua viene fornito con una versione gratuita reference manual per la versione 5.2 (che sto utilizzando) e Programming in Lua per la versione 5.0 è anche disponibile.L'incorporamento di Lua 5.2 e la definizione di librerie

Ci sono stati, tuttavia, un paio di cambiamenti tra queste versioni che non riesco a superare. Le modifiche sono indicate nelle versioni successive del manuale di riferimento per 5.2 e 5.1. Si noti la successiva sospensione di luaL_openlib() in favore di luaL_register(), quindi luaL_register() in favore di luaL_setfuncs().

Le ricerche sul Web danno risultati misti, con la maggior parte di essi che punta a luaL_register().

Quello che cerco di ottenere possono essere sintetizzati dal mini-programma di seguito che può essere compilato e collegato con dire, 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; 
} 

Questo funziona come previsto e digitando t1() produce il risultato atteso.

Vorrei ora creare una libreria/pacchetto visibile a Lua. I Programming in Lua consigli noi to use una matrice e una funzione di carico:

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

quindi utilizzare luaopen_tlib() dopo luaL_openlibs(). Ciò ci consente di utilizzare tlib:t2() se definiamo LUA_COMPAT_MODULE (funziona in modalità compatibile).

Qual è il modo corretto di farlo in Lua 5.2?

risposta

8

La funzione luaopen_tlib deve essere scritto in questo modo:

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

E nella funzione main, si dovrebbe caricare il modulo come questo:

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

Oppure, in alternativa, è possibile aggiungere una voce {"tlib", luaopen_tlib} alla tabella loadedlibs in linit.c.

+0

Il luaL_openlibs è facoltativo e probabilmente non dovrebbe esserci (per l'esempio). – Cubic

+0

Ho modificato l'esempio in modo che mostri solo la linea importante. – prapin