Voy a hacer un aparte para hablar un poco sobre la herramienta que uso para generar el código de enlace entre el intérprete Lua embebido y la aplicación que lo hospeda, en este caso el server.
En mi caso utilizo Lua porque es un lenguaje muy sencillo, medio Pascal, medio C, rápido y con las funcionalidades que necesito. Ahora bien, generar el código necesario para hacer accesibles las clases de C++ a los scripts es una tarea larga, tediosa y susceptible a errores de todo tipo.
Aquí entran los generadores de código, como Swig. Sin embargo, Swig genera código para proporcionar al script Lua la definición de una clase. Si quisiéramos enviar valores, por ejemplo, de dos entidades, habría que usar algún truco extra.
Por suerte hay varias variantes en el caso de Lua, y de ellas, mi preferida es tolua++. Este programita toma un encabezado limpio con algunas directivas específicas y genera el código de enlace que no solo proporciona a Lua la estructura de la clase, sino también funciones para enviar variables al script, variables que pueden ser modificadas.
Supongamos que tenemos el siguiente código en un archivo test.h:
const int C = 10;
class test {
public:
test();
int a,b;
};
El encabezado (o package) para tolua++ sería:
$#include "test.h"
#define C = 10;
class test {
public:
test();
int a,b;
};
Que procesamos con la sintaxis siguiente:
tolua++ -n test -H test_wrap.h -o test_wrap.cpp test.h
Ahora solo necesitamos incluir el encabezado tolua++.h, amén de nuestros dos archivos generados con el código de enlace y por supuesto, enlazar la biblioteca de tolua.
Hacemos disponible la definición de la clase al intérprete Lua:
tolua_test_open(luaVM);
y para enviarle una instancia n de test al script simplemente:
tolua_pushusertype(luaVM,(void*)n,"test");
lua_setglobal(luaVM,"n"); //Aquí le decimos cómo se llamará la variable dentro del script
¿Desventajas? Que necesita linkear una biblioteca extra. Que tolua++ usa scons para compilarse y no make. Pero las ventajas superan con creces estas nimiedades.
En mi caso utilizo Lua porque es un lenguaje muy sencillo, medio Pascal, medio C, rápido y con las funcionalidades que necesito. Ahora bien, generar el código necesario para hacer accesibles las clases de C++ a los scripts es una tarea larga, tediosa y susceptible a errores de todo tipo.
Aquí entran los generadores de código, como Swig. Sin embargo, Swig genera código para proporcionar al script Lua la definición de una clase. Si quisiéramos enviar valores, por ejemplo, de dos entidades, habría que usar algún truco extra.
Por suerte hay varias variantes en el caso de Lua, y de ellas, mi preferida es tolua++. Este programita toma un encabezado limpio con algunas directivas específicas y genera el código de enlace que no solo proporciona a Lua la estructura de la clase, sino también funciones para enviar variables al script, variables que pueden ser modificadas.
Supongamos que tenemos el siguiente código en un archivo test.h:
const int C = 10;
class test {
public:
test();
int a,b;
};
El encabezado (o package) para tolua++ sería:
$#include "test.h"
#define C = 10;
class test {
public:
test();
int a,b;
};
Que procesamos con la sintaxis siguiente:
tolua++ -n test -H test_wrap.h -o test_wrap.cpp test.h
Ahora solo necesitamos incluir el encabezado tolua++.h, amén de nuestros dos archivos generados con el código de enlace y por supuesto, enlazar la biblioteca de tolua.
Hacemos disponible la definición de la clase al intérprete Lua:
tolua_test_open(luaVM);
y para enviarle una instancia n de test al script simplemente:
tolua_pushusertype(luaVM,(void*)n,"test");
lua_setglobal(luaVM,"n"); //Aquí le decimos cómo se llamará la variable dentro del script
¿Desventajas? Que necesita linkear una biblioteca extra. Que tolua++ usa scons para compilarse y no make. Pero las ventajas superan con creces estas nimiedades.
Comentarios
Publicar un comentario