A Coder’s Corner

Blog de tecnologia y programación

Lua + LuaBind = Perfecta Combinación

Posted by gfaraj on November 6, 2005

Nota: Este articulo usa Lua 5.0 y Luabind 0.7. Puede que no compile con las versiones mas recientes de estos productos.

Lua es un “embedded language”. Es usado para incorporar scripting en ciertas aplicaciones. Hay un API para C que se usa para registrar funciones de C en el interpretador de Lua. Asi que en los scripts de Lua se pueden usar funciones que han escrito en C. Lo pueden bajar de aqui. Luabind es un API para C++ que encapsula más limpiamente la registración de funciones y agrega registración de clases, entre muchas otras cosas (como soporte para templates, sobrecarga de operadores, etc). Aqui les va mi primera aplicación de scripting con Lua:

#pragma comment(lib, "lua50.lib")
#pragma comment(lib, "luabind07.lib")

extern "C"
{
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

#include <luabind/luabind.hpp>
#include <iostream>

int f()
{
    std::cout << "f()" << std::endl;
    return 92;
}

struct A
{
    A() { std::cout << "A()" << std::endl; }
    ~A() { std::cout << "~A()" << std::endl; }

    void blah() { std::cout << "A::blah" << std::endl; }
};

int main()
{
    lua_State* L = lua_open(); // abrimos un interpretador
    luaopen_base(L);           // abrimos la biblioteca base
    luaopen_math(L);           // abrimos la biblioteca de mate
    luabind::open(L);          // requerido para luabind

    using namespace luabind;

    // ahora registramos lo que querramos
    module(L)
        [
            // registramos la clase A
            class_<A>("A")
                // registramos su constructor
                .def(constructor<>())
                // registramos su funcion blah()
                .def("blah", &A::blah)
            ,
            // registramos la funcion global f
            def("f", &f)
        ];

    // ejecutamos un script, llamado lua_test.lua
    lua_dofile(L, "lua_test.lua");

    lua_close(L);
    return 0;
}

El archivo lua_test.lua:

x = f()
print(x)
some_a = A()
some_a:blah()

La salida de este programa es:

Hola!
92
A()
A::blah()
~A()

Como podrán ver, es muy sencillo y practico. Me gusta bastante. Les recomiendo probarlo y usarlo cuando necesiten algo similar en sus aplicaciones.

8 Responses to “Lua + LuaBind = Perfecta Combinación”

  1. gilber said

    Hola, por favor quiero pedirte ayuda en lo siguiente:

    quero escribir un programa o funciòn, que escrita en C/C++ me calcule el volumen de una figura gemètrica de de longitudes a=12 b=1.45;y, h=0.80 y luego ser ejecutada en lua

    Estoy aprendiendo esto, de manera que sea lo mas explìcito posible.
    Geacias

  2. gfaraj said

    Hola Gilber,

    Ya bajaste Lua? Si solo necesitas registrar una funcion capaz no sea tan util bajar Luabind, pero te recomiendo siempre tenerlo. Luego de bajar estas librerias, tendras que compilarlas como librerias estaticas usando tu compilador favorito. Si se te hace muy complicado esto, puedes bajar los binarios de Lua aqui. Los binarios de Luabind no los encontre.

    Despues de tener todo eso arreglado, podrias usar mi ejemplo para guiarte en tu ejercicio. Si tienes alguna pregunta especifica, no dudes en hacerla aqui.

  3. gilber said

    Hola, gracias por responder
    Te cuento que tengo una ClassPad 300 a la cual le agregué un ADD_IN de lua versión
    0.9E.
    Por otro lado tengo instalado el Dev-c++ en PC. Lo que quiero consultarte es como hacer un ADD_IN pata el lua instalado (0.9E)

    Como hacer lo que propones en el foro “Lua + LuaBind = Perfecta Combinación”, es decir que tengo que tener instalado en el PC para poder hacerlo

    Talvez tengo que tener algún ejecutable instalado??. Ó instalar librerías en el Dev-c++? , y como hacerlo!!!

    Por favor disculparás

    Un saludo cordial

  4. gfaraj said

    Hola Gilber,

    Ahh, queres hacerlo para una ClassPad. Pues para hacer un programa para tu calculadora vas a ocupar bajar el SDK, http://www.cpsdk.com. Me imagino que a lo que te referis por “lua 0.9E” es el CPLua 0.9E. Eso esta bien.

    Te dare un par de links que me parece que te podrian servir:

    http://en.classpad.fr
    http://www.casiocalc.org/?showforum=19

    El primero tiene varios add-ins hechos para la ClassPad y te dan el codigo fuente para que podas empezar el tuyo.

    Creo que no te puedo ayudar mas ya que nunca he hecho un programa para esta calculadora (no sabia que era una calculadora hasta que la mencionastes🙂 ).

    Espero te ayude

  5. andrea said

    ps quiero hacer un progrma que divida dos numeros y el resultado sea el residuo.

  6. Kyon said

    Hola gfaraj

    Tengo una duda.
    Como el programa lua reconoce que esta usando la funcion c?
    por que no veo en su codigo algo donde se llame el archivo lua.

    o ese llamado hay que hacerlo desde el archivo lua

  7. Kyon said

    Ya solucione la duda que tenia anteriormente, pero tengo una nueva duda. Es posible registrar metodos que estan en otra clase diferente a la clase donde estoy realizando el registro?

  8. sam's club said

    It’s an remarkable article for all the web people; they will take advantage from it I am sure.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: