Pregunta

Actualmente estoy trabajando en la implementación de Lua en una de las aplicaciones que los que estoy trabajando. Actualmente estoy usando la API de C y el registro de funciones utilizando lua_register, pero me gustaría ser capaz de pasar los punteros de función estática estático y no a determinados métodos de clase.

He encontrado algunas librerías en la red, pero ya que necesito muy poco de la funcionalidad global que proporcionan Me preguntaba si hay una manera fácil de hacer esto.

Gracias.

¿Fue útil?

Solución

A API biblioteca complejo a menudo puede ser envuelto de forma rápida y (casi) completamente utilizando SWIG . Una ventaja de utilizar el TRAGO en este caso es que es fácil de construir envolturas basadas en TRAGO que permiten el uso de la biblioteca en 18 idiomas principales incluyendo Lua, Perl, Python, Ruby y Java, entre otros.

Si Lua es su (posiblemente solamente y) se refieren preferido, te recomiendo aprender a usar luaL_register() en el núcleo de una estrategia para construir módulos de Lua en C. una ventaja de la construcción de un módulo de esta manera es que mantenga todas sus funciones en un único espacio de nombres sin ningún tipo de gastos. Usted tendrá que diseñar una función de contenedor que coincida con la convención función de llamada Lua C (tal como lo hace con lua_register()) y que reúne los argumentos Lua de la pila, llama a la función envuelto, y empuja cualquier valor de retorno y parámetros de salida de nuevo a la Lua pila. Una buena visión general de cómo ir sobre esto se puede encontrar en el libro de programación en Lua. La copia en línea de la primera edición discute la creación de la biblioteca en , pero fue escrito para Lua 5.0. Insto encarecidamente a cualquiera que utilice serio Lua de poseer una copia de la edición actual de PIL.

Desafortunadamente, un área en la Lua 5,1 difiere más de 5,0 se encuentra en la carga dinámica de módulos (tanto C como LUA) con require.

Aquí hay una (si es pequeño) ejemplo completo para una biblioteca de C que funciona en Lua 5.1. Comenzamos con la aplicación de la envoltura en un archivo C:

#include <lua.h>
#include <luaxlib.h>
#include <math.h>
#undef PI
#define PI (3.14159265358979323846)

static int l_sin (lua_State *L) {
    double r = luaL_checknumber(L,1);
    lua_pushnumber(L, sin(r));
    return 1;
}

static int l_cos (lua_State *L) {
    double r = luaL_checknumber(L,1);
    lua_pushnumber(L, cos(r));
    return 1;
}

static const struct luaL_reg smlib [] = {
    {"sin", l_sin},
    {"cos", l_cos},
    {NULL, NULL}  /* sentinel */
};

int luaopen_sm (lua_State *L) {
    luaL_openlib(L, "sm", smlib, 0);
    lua_pushnumber(L,PI);
    lua_rawset(L,-2,"pi");
    return 1;
}

Tenga en cuenta especialmente que la única función que necesitan ser exportada es luaopen_sm(), cuyo nombre debe coincidir con el nombre del módulo que será utilizado con require, y con el nombre del archivo DLL. Con ese archivo compilado como un archivo DLL llamado sm.dll (probablemente llamado libsm.so en sistemas tipo Unix), entonces puede ser cargado y utilizado en un script Lua como esto:

require "sm"
print(sm.sin(sm.pi/3), sm.cos(sm.pi/3));

En este ejemplo, aunque no probado, debe compilar y ejecutar. Para un ejemplo completo de envolver mayoría de las funciones de math.h, ver el href="http://www.lua.org/source/5.1/lmathlib.c.html" rel="nofollow fuente al módulo math que se distribuye con Lua. Debido a que estas envolturas delgadas contienen una gran cantidad de código repetitivo, herramientas como el TRAGO son a menudo capaces de crearlos dan sólo la declaración de cada función.

métodos de embalaje de una clase de C ++ es similar en principio. Cada función de contenedor Lua-exigible va a necesitar un argumento que se puede mapear en this en el lado C ++, y debe ser implementado ya sea como una función del módulo-estática o función miembro estática que también localiza la instancia de objeto de destino, así como los convertidos los otros argumentos. TRAGO es particularmente bueno en la construcción de este tipo de envoltorio y se esconde una gran cantidad de detalles morbosos en el camino.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top