Lua en 5 minutos

17 views
Skip to first unread message

David Martínez

unread,
Apr 14, 2010, 5:02:12 PM4/14/10
to Lista Occam's Razor
Muchos conoceréis Lua, un lenguaje de scripting que se ha popularizado
bastante en los últimos años.

Por ejmplo WoW (World of Warcraft) lo utiliza como lenguaje de script en
el cliente del juego. Aquí podéis encontrar una lista exhaustiva de
otros juegos que lo utilizan.

http://en.wikipedia.org/wiki/Category:Lua-scripted_video_games

El lenguaje probablemente se haya hecho tan popular, por lo sencillo que
resulta incluirlo en nuestras aplicaciones. Y para muestra un botón:

http://drj11.wordpress.com/2008/04/03/embedding-lua-in-5-minutes/

Como podéis ver es tremendamente sencillo. El ejemplo tal cual aparece
no funciona directamente con LUA 5.1 en Ubuntu. Sólo he tenido que
cambiar los includes del principio, así que comprobad la installación de
LUA en vuestro sistema si algo falla.

Aprovechando la coyuntura he ampliado el ejemplo para mostrar como
ejecutar funciones de nuestro programa principal desde nuestros scripts
en LUA. Aquí tenéis mis cambios:

---8<------------------------------------------
#include <stdio.h>

// Con LUA 5.1 en Ubuntu los includes están aquí
#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>

static lua_State *l;

int
my_func (lua_State *L)
{
int x;
if (lua_gettop(L) >= 0) {
x = (int) lua_tonumber (L, -1);
printf ("Me dices : %d\n", x);
/* Devolvemos el parámetro + 1*/
lua_pushnumber(L, x + 1);
}
return 1;
}

int
main(int argc, char *argv[])
{
if (argc >= 3 && strcmp(argv[2], "-l"))
{
l = luaL_newstate ();
luaL_openlibs (l);

/* Añade nuestra función t la llama simon_dice */
lua_pushcfunction(l, my_func);
lua_setglobal(l, "simon_says");

luaL_dostring (l, argv[2]);
printf ("%s\n", lua_tostring (l, -1));
/* Borramos la pila */
lua_settop (l, 0);
}
else
fprintf (stderr, "Número incorrecto de parámetros\n"
"Uso: %s -l 'codigo_lua'\n",
argv[0]);
return 0;
}
--8<----------------------------------------------------------

Para compilar el programa:

$ gcc -o test test.c -llua5.1

o

$gcc -o test test.c -llua

Dependiendo de que librería tengáis instalada.

Para probar esta modificación podéis ejecutar algo como lo siguiente:

$ ./test -l 'print ("Simon Dice:" .. simon_dice (10)); return "YaTá"'

Que dará como resultado algo así:

--8<----------------------------
Me dices : 10
Simon Dice:11
YaTá
--8<----------------------------

Como podéis ver... si que es fácil ¿no?

Saludos

--
GNU/EDMA HomePage : http://www.gnu.org/software/edma
Personal Web Pages : http://papermint-designs.com/dmo
Blogs (dmartin/picoFlamingo) : http://community.papermint-designs.com
Revista Occam's Razor : http://webs.uvigo.es/occams-razor

Reply all
Reply to author
Forward
0 new messages