History: Básicos de Lua

Revision made 7 years ago by Jakub Janarek. Go to the last revision.

¿Lua? ¿WTF?

AKA otra cosa que estudiar

Lua es un lenguaje muy simple, dinámicamente tipado e interpretado. Por eso, no tiene tipos explícitos (como el "int" o "char" de C++), y no se compila, sino se ejecuta.

Viene genial para hacer juegos simples con Love2d, scripting en juegos complejos como Garry's Mod o LoL, servicios web (OpenResty), e incluso deep learning o simular redes neuronales. En fin, tiene potencial ;)

Dicho esto, empecemos con el lenguaje. Espero que disfrutes y aprendas.

Lo básico de los básicos

Variables, tipos y comentarios

Lua, como todos los lenguajes tiene variables, o cosas a las que asociamos valores con un "=". Estos valores pueden ser de 8 tipos:

  • number o números,
  • strings o cadenas de caracteres,
  • function o funciones, que son bloques de código que manipulan a los objetos y variables cambiando su estado,
  • boolean o variables lógicas true o false (verdadero o falso por si el inglés no es tu fuerte),
  • nil o variable nula, parecida al null de JavaScript o Java,
  • table, que equivale a arrays (o listas de variables) y maps, o listas de pares de llave y valor asociado,
  • thread o hilo del programa, que es una línea de ejecución independiente del código,
  • userdata o la posición de un objeto, por ejemplo una tabla, en la memoria

También podemos comentar código en Lua, para explicar que hace a otros o a nosotros mismos :) con un "--comentario" si el comentario tiene una línea o "--[[comentario]]--" si tiene varias líneas.

No te preocupes si estas cosas te suenan como a chino, ahora verás unos ejemplos.

--esto es un comentario :)

-- declaración de variables:
numero = 43
string = "soy una string"

-- explicaremos las funciones y tablas más adelante
mifuncion = function() return 1 end
unaTabla = {1,2,"bla"}

Volviéndonos posesivos

Estructuras de control: if

Podemos manipular el flujo del programa con los palabrajos for, if, y while. Así, controlamos que bloques de código se ejecutan y cuáles no. Todo este flujo va determinado por ciertas condiciones, las que se nos ocurran oportunas. Sé que parece abstracto, pasemos a la práctica con el if.

if numero == 43 then
  print('soy 43!')

elseif numero ~= 34 then
  print("no soy 34")

-- si no se cumple ninguna condición
else
  print("lo que sea")

end

Como puedes observar, el if...elseif...else es menos peligroso que el Osasuna: solo fíjate que el else no tiene condición asociada, y el bloque acaba con un buen "end". No hace falta que uses elseif y else siempre, si compruebas una condición, entre if y then por cierto, te puede bastar con un solo if. Perfecto, el if lo tenemos cubierto. Pasemos al siguiente, el bucle for.

Estructuras de control temporada 2: for

El for se usa normalmente para moverse por estructuras con varios elementos, tipo cada celda cercana del buscaminas para ver si hay minas o cada entrada en la base de datos de la NSA. Por eso, es bastante útil y no demasiado complicado.

misDolares = 0

for i = 1, 2000 do    -- va de 1 a 2000
  misDolares = misDolares + 1  -- incrementamos la variable en uno
end

-- ¡Ahora tengo 2000 dólares!

El for tiene algo más de chicha, pero no podemos aprovecharlo del todo hasta que no veamos funciones y tablas. Después de ver el bucle while vamos allá.

Más y mejor control con while

La últma estructura de control, el while, nos permite ejecutar código repetidamente basado en una condición. Su sintaxis es:

while condicion do
  -- hace algo
end

Bueno, bonito y barato. Puedes usarlo a veces en vez del for. Ahora, vienen las funciones, en las que se basa cualquier programa decente :)

Fun Funcions!

O de porqué repetirse es malo

Las funciones te permiten reusar código que realiza tareas concretas, y encapsularlo en bloques. Son algo menos complicadas de aprender que ej. el Euskera, así que no te preocupes mucho. Como de costumbre, te enseñamos como se escriben en Lua:

function nombre(parametros)
  -- el cuerpo de la función,
  -- lo que hace con los parámetros u otras variables
end  -- se cierra el bloque

Puedes ver que la función básica tiene un nombre y uno o varios parámetros. Además, puedes alterar el estado de variables externos a la función o los que toma como parámetros, y devolverlos.

misLamborghinis = 0

function serCamello(duracionSemanas)
  misLamborghinis = misLamborghinis + 1 * duracionSemanas
  return misLamborghinis
end

En ese fragmento, nos hacemos camellos incrementamos el número de deportivos al ritmo de 1 por semana de trabajo ¿Nada mal? Te dije que sería divertido. Aún mejor, podemos llamar las funciones:

misLamborghinis = serCamello(20)

-- ¡Ya tenemos 20!

Todo ello debido a que serCamello(20) nos devuelve la variable misLamborghinis con valor de 20 (y tipo number, por cierto). La funciones serán la base de la manipulación de tablas, así como imprescindibles para los juegos en Love2d, ya que la librería entera es sobretodo un manojo de funciones. Dicho lo dicho, con gran poder viene gran responsabilidad. Usa las funciones donde toque, y no te compliques la vida con funciones si tienes que hacer un bloque de código simple para una cosa en concreto.

Tablas siempre tablas

Puedes odiarlas o amarlas

Así, llegamos al último tópico de esta "breve" introducción a Lua. Probablemente sea el más complejo con diferencia, o probablemente no :)=. Las tablas, como mencionamos brevemente antes, son la única estructura de datos en Lua, y equivalen a array y std::map en C++. Representan listas de valores, o de llaves y valores. Ahora te pongo unos ejemplos:

listaDeNumerosSuperRandom = {1, 2, 7, 6, 3}
jugadoresDelMadrid = {"Navas": 1, "Cristiano": 7, (bla bla)}

-- Nos preguntamos, ¿qué número tiene Keylor?
-- para ello escribimos el resultado de llamar a la llava "Keylor"
-- e imprimirla en la pantalla con la función de Lua io.write()

io.write(jugadoresDelMadrid["Navas"])

-- escribe en la pantalla: 1

Buah, ejemplaco. Espero que lo hayas entendido: creamos dos tablas, una "tipo array" y la otra "tipo map" , e imprimimos el valor de la llave "Navas" de la segunda tabla en la pantalla. Por cierto, tablas son mucho más que eso, y permiten la orientación a objetos en Lua mediante metatablas y metamétodos. Te dije antes, el asunto da para mucho, aunque no llega al nivel de física cuántica nuclear :D

And the journey begins...

Más cosas buenas

Enhorabuena por llegar tan lejos, ¡ya sabes más de Lua que el 99,99% de personas! Eso sí, nos queda mucho más, no hemos cubierto todo, y te espera más diversión tratando de domar el intérprete de Lua en tu casa. Para ayudarte, te adjunto materiales buenos en inglés, así de paso mejoras tus skills  del idioma. Como te habrás fijado, hay pocos materiales en castellano, y aún menos que sean buenos. ¿No crees que es tiempo de cambiarlo? Podrías contribuir a Libre University con lo que hayas aprendido ;)

Links links links

un resumen de lo más importante: https://learnxinyminutes.com/docs/lua/

libro oficial gratis: http://www.lua.org/pil/contents.html

metatablas y orientación a objetos: http://nova-fusion.com/2011/06/30/lua-metatables-tutorial/

corutinas o pseudo-paralelismo: https://docs.google.com/document/d/1UU-bSCgLqwAQixldXmDzvEFPACaieph3qs08WreQlZs/edit