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?
Il luaL_openlibs è facoltativo e probabilmente non dovrebbe esserci (per l'esempio). – Cubic
Ho modificato l'esempio in modo che mostri solo la linea importante. – prapin