Introducción a Lua

Posted Marzo 10th, 2010 in Sin categoría by Amadeo Bolzano

Lua es un lenguaje de scripting diseñado con el principal objetivo de ser ligero y extensible. El pequeño tamaño de su runtime y su API C sencilla han hecho que sea elegido en muchas ocasiones para ser embebido en aplicaciones como nmap o Monotone, o en multitud de juegos (WOW, FarCry…). De hecho, viene utilizándose en videojuegos desde hace unos diez años.

Lua apareció por primera vez en 1998 y tiene su origen en la Universidad Pontifica Católica de Rio de Janeiro [PUC-Rio].

El lenguaje
Lua es un lenguaje sencillo. Una de sus principales influencias declaradas es Lisp y su idea de una única estructura, la lista. En el caso de Lua, esta estructura clave fundamental de su arquitectura es la tabla. Como lenguaje más parecido podría nombrarse Javascript. Ambos son lenguajes de script, con soporte para OO basada en prototipos.

Lua es rápido para su naturaleza interpretada; suele quedar en buen lugar en las comparativas.

La sintaxis recuerda a una mezcla de Pascal con otros lenguajes. Un clásico:

– Una función:
function diHola(persona)
— Un bucle:
for i=1,3 do
print(“Hola ” .. persona .. “!”)
end
end
print(“¿Cómo te llamas?”)
nombre = io.read()
– Llamada a una función:
diHola(nombre)

Lua soporta un estilo procedural imperativo, pero también un estilo funcional. De hecho, en Lua las funciones son entidades de primera categoría. La función del ejemplo anterior, en realidad se interpreta como:

diHola = function(persona)
print(“Hola ” .. persona .. “!”)
end
Si tenéis cierta experiencia con Javascript quizá esa forma de escribirlo os sea familiar.

Lua, como decía antes, también soporta orientación a objetos, y lo hace basándose en la estructura de la tabla. Una tabla como t:

t = {}
puede contener funciones, como:

function t.diHola(persona)
print(“Hola ” .. persona .. “!”)
end
t.diHola(“Peter”)
O, si utilizamos : en lugar de . Lua nos pasará como primer parámetro self, una referencia a la tabla (u objeto):

t = {}
t.nombre = “Peter”
function t:diHola()
print(“Hola ” .. self.nombre .. “!”)
end
t:diHola()
– Que es lo mismo que t.diHola(t) o que t['diHola'](t)
Con esto tenemos todo lo necesario para encapsular objetos. Para otros aspectos de la OO, Lua se se basa en la idea de metatabla, una forma de asociar a una tabla T otra T’ en la que se irán a buscar los métodos que no se encuentren en T. Con esto tenemos un mecanismo de herencia. Entrar en detalle del manejo de las metatablas, OO, metaprogramación u otros aspectos más avanzados quedan (quizá) para posibles próximos artículos.

Referencias y Herramientas
La referencia fundamental para aprender Lua es, sin duda, el libro Programming in Lua, del cual se puede encontrar online la primera edición. Es un buen libro, bien escrito y con explicaciones detalladas pero asequibles a cualquiera. Como complemento, el Manual de Referencia que también se puede adquirir impreso o consultar online.

La otra referencia habitual es el Wiki de Usuarios de Lua donde podemos encontrar tutoriales y código, su lista de correo lua-l o el canal de IRC en Freenode.

Existen, además, unos cuantos libros y tutoriales más específicamente orientados a desarrollar modificaciones de determinados juegos, o a la programación de juegos en general.

El soporte por parte de los editores e IDEs es suficientemente amplio. Personalmente recomiendo SciTE un editor muy sencillo con la cualidad de que utiliza Lua para programar macros. Existen también una buena cantidad de librerías y enlaces que se encuentran listadas en el Wiki.

LuaForge es un buen lugar para encontrar proyectos de y para este lenguaje. El Kepler Project es otra interesante referencia que desarrolla y mantiene una variada colección de módulos principal pero no exclusivamente orientados al desarrollo web.

Por último, para comenzar con Lua en Windows se puede encontrar un cómodo instalador que incluye binarios de Lua, un buen número de librerías fundamentales y el editor SciTE, además de unos cuántos ejemplos y documentación.

viaes.debugmodeon.com