Lua + C + Python - Mais que uma combinação macabra, uma gambiarra sinistra
Antes de mais nada: Por que? Eu precisava fazer deploy de uma shared library em um ARM com linux(um raspberry Pi) extremamente capado, e não podia instalar todas as tools de dev, pois estava no limite de espaço do cartão, devido a aplicação dele. Mas precisava desta shared lib para carregar no python, via ctypes, pois o mesmo usaria as informações extraidas do hardware pelo .c, interpretaria e daria ordens ao resto da eletrônica. Acontece que os parametros do C variavam muito, precisavam ser tunados constantemente. Foi daí que rolou a ideia do LUA. A ideia foi boa? Bom, funcionou. E até que faz um pouco de sentido, de alguma forma haha
vamos la, o loader, em python, é simplezão:
$ cat > loader.py << _EOF_ import ctypes biblioteca=ctypes.CDLL('./zoalib.so') biblioteca.zoeira.restype = ctypes.c_int biblioteca.zoeira.argtypes = [ctypes.c_int] biblioteca.zoeira(5) _EOF_
O loader em C:
$ cat >zoalib.c << _EOF_ #include "lua.h" #include "lauxlib.h" int zoeira(int a) { double z; lua_State *L = lua_open(); luaL_openlibs(L); luaL_loadfile(L, "zoeira.lua"); /* arquivo lua */ lua_pcall(L, 0, 0, 0); /* limpa a pilha */ lua_getglobal(L, "modelamotor"); /* nome da função do lua */ lua_pushnumber(L, 3); /* envia primeiro argumento */ lua_pushnumber(L, 4); /* envia segundo argumento */ lua_pcall(L, 2, 1, 0); z = lua_tonumber(L, -1); /* pega resultados */ printf("Resultado: %f\n",z); lua_pop(L, 1); lua_close(L); return (a+1); } _EOF_
E o script em lua:
$ cat > zoeira.lua << _EOF_ function modelamotor (param1, param2) return math.sqrt(param1^2 + param^2) end _EOF_
Agora, vamos compilar com estes poucos parametros e rodar haha:
$ gcc -I/usr/include/lua5.1 zoalib.c -llua5.1 -lm -fPIC -shared -Wl,-soname,zoalib -o zoalib.so $ python l.py Resultado: 5.000000 6
Hell yeah! Embora isso seja absurdamente mais util nos raspberryPi/beaglebone, talvez haja algum uso no desktop, vai saber haha.