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?
LuaL_openlibs jest opcjonalne i prawdopodobnie nie powinno tam być (na przykład). – Cubic
Edytowałem przykład, tak aby pokazywał się tylko ważny wiersz. – prapin