Anuncios

Bienvenidos sean a este post, un uso importante de Lua es como un lenguaje de configuracion.

Anuncios

Para nuestra primer tarea vamos a imaginar un escenario de configuracion simple:

Tu programa de C tiene una ventana y queremos que el usuario puede especificar el tamaño inicial de la misma

Anuncios

Obviamente para tales tareas sencillas hay muchas opciones mas simples que usar Lua, tal como variables de entorno o pares de nombre-valor pero incluso usando un simple archivo de texto debes tener la posibilidad de analizarlo de alguna manera, asi que decidimos usar un archivo de configuracion de Lua, un archivo de texto plano que resulta ser un programa de Lua, su forma mas simple resulta en un codigo como se ve a continuacion:

-- tamaño definido de ventana
ancho = 200
alto = 300
Anuncios

Nuestro siguiente paso debe ser usar la API de Lua para direccionar a Lua y poder analizar este archivo para luego conseguir los valores de las variables globales ancho y alto, veamos el siguiente codigo:

void load (lua_State *L, const char *fname, int *an, int *al)
{
	if (luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0))
		error(L, "no puedo correr arch. config: %s", lua_tostring(L, -1));
	lua_getglobal(L, "ancho");
	lua_getglobal(L, "alto");
	if (!lua_isnumber(L, -2))
		error(L, "'ancho' deberia ser un numero\n");
	if (!lua_isnumber(L, -1))
		error(L, "'alto' deberia ser un numero\n");
	*an = lua_tointeger(L, -2);
	*al = lua_tointeger(L, -1);
}
Anuncios

La funcion load en este caso asume que ya esta creado un estado de Lua siguiendo lo que vimos en los posts anteriores llama a luaL_loadfile para cargar el chunk desde el archivo, fname, y luego llama a lua_pcall para ejecutar el chunk compilado, en caso de error (p.e. un error de sintaxis en el archivo) estas funciones empujan un mensaje de error en la pila y devuelve un codigo de error no cero, nuestro programa luego usa lua_tostring con el indice -1 para conseguir el mensaje desde la parte superior de la pila.

Anuncios
Anuncios

Suponiendo que no ocurrio el error nuestro programa necesita conseguir los valores de las variables globales, y para eso llama dos veces a lua_getglobal cuyos parametros simples (al margen del omnipresente lua_State) es el nombre de la variable, cada llamada empuja el valor correspondiente dentro de la pila asi que el ancho estara en el indice -2 y el alto en el indice -1, pero como la pila estaba previamente vacia tambien podriamos haber usado el indice 1 para ancho y el 2 para alto, aunque trabajar de la primer forma nos garantiza que funcionara a pesar de que la pila no este vacia, despues de esto por medio de lua_isnumber verificamos que cada valor sea numerico, en caso de no ser cierto devolveremos el mensaje de error correspondiente para cada caso, en caso de que ambos sean numericos nuestro siguiente paso sera asignarlos a los apuntadores (variables) los valores correspondientes por medio de lua_tointeger para asegurarnos de que sean valores enteros (integer) y sean asignados correctamente.

Anuncios

Pero valio la pena usar Lua para esta tarea? Como dijimos al principio para tales simples tareas, un archivo plano con dos numeros seria mas sencillo que usar Lua, aun asi el lenguaje de Lua trae algunas ventajas:

  • primero Lua maneja todos los detalles de sintaxis (y errores) por ti, tu archivo de configuracion puede tener incluso comentarios
  • segundo el usuario es capaz de crear archivos de configuracion mas complejos con esto
Anuncios

Por ejemplo el script podria solicitar al usuario informacion o puede buscar una variable de entorno para elegir un tamaño apropiado, como se ve a continuacion:

-- archivo de configuracion

if getenv("DISPLAY") == ":0.0" then
	ancho = 300; alto = 300
else
	ancho = 200; alto = 200
end
Anuncios

Incluso en escenarios tan simples de configuracion es dificil anticipar que querra el usuario pero miesntras el script defina las dos variables tu aplicacion de C trabaja sin cambios, una razon final para usar Lua es que ahora es mas facil agregar aplicaciones de configuracion a tu programa, esta facilidad crea una actitud que resulta en programas mas flexibles.

Anuncios

En resumen, hoy hemos visto como extender a un programa de otro lenguaje por medio de Lua, si bien el ejemplo es simple, nos sirvio para ver como desde una tareas practica y sencilla puede lograr derivar en una automatizacion en base al entorno que poseemos, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00