Las expresiones van de la mano con los valores, estos nos permiten realizar operaciones con los mismos, que pueden ir desde operaciones aritméticas, relacionales e incluso condicionales para darle dinamismo a nuestros programas, pero antes de pasar con las expresiones veamos los tipos de valores que poseemos en Lua y de que forman funcionan dentro del lenguaje.
Tipos y valores
En Lua cada valor carga su propio tipo, en el cual podemos encontrar ocho tipos diferentes de estos: nil, booleano, número, string, userdata, funcion, hilo y tabla, donde con la función type() podemos saber el nombre del tipo del valor dado. Veamos un ejemplo sencillo de como Lua interpreta esto de acuerdo a type():
Como vemos el tipo viene dado por el valor que carga y la función designada nos ayuda a saber cual es, podemos ver que incluso en el último caso de la variable H el resultado es string y esto es porque la función type() siempre es string. Ya que vimos como Lua interpreta los tipos de datos veamos a detalle cada uno de estos:
Como vemos los tipos no discrepan mucho de lo que podemos encontrar en los lenguajes actuales, pero lo que si es seguro es que la simplicidad que tenemos para representar los mismos es mucho mayor, veamos entonces el papel de las expresiones y como podemos utilizarlas con nuestros valores.
Operaciones aritméticas
Las operaciones aritméticas son sumamente importantes para cualquier programa y es importante conocer como manejar las mismas y que restricciones pueden existir en el lenguaje que estamos utilizando. Lua soporta los operadores convencionales a los cuales estamos acostumbrados: La adición, sustracción, multiplicación , división, exponencial, porcentaje y la negación.
Veamos entonces un código sencillo donde demostramos el uso de algunos operadores de Lua:
x = 8 + 5 y = 9 - 2 print(x * y%0.01)Utilizamos la suma, la resta, y la división entre 2 sobre el resultado de una operación de multiplicación, veamos como la respuesta del interprete cuando ejecutamos nuestro código por consola:
Como vemos Lua no difiere mucho del resto de los lenguajes para las operaciones aritméticas, pero su simplicidad para escribir código lo hace bastante sencillo de manejar para el desarrollo de programas.
Operadores relacionales
Lua al igual que otros lenguajes nos brinda operadores relaciones como el mayor que >, menor que <, menor o igual <= o mayor o igual >=, el igual-igual == y la negación ~=. Vemos que el único que quizá difiere es la negación pero luego que nos acostumbremos no habrá problemas con su uso.
Todos estos operadores pueden retornar verdadero o falso, donde incluso podemos aplicar tanto el operador de igualdad como el de negación a dos valores. Estas comparaciones Lua las hace en función del tipo además de otros factores, veamos en el siguiente código donde la comparación se hace en función del mismo objeto:
a = {}; a.x = 1; a.y = 0 b = {}; b.x = 1; b.y = 0 c = aDonde si comparamos los mismos el resultado de la operación nos da que a es igual a c pero que a es diferente a b, esto por un tema de que son el mismo objeto. Adicionalmente, debemos tener sumo cuidado al comparar diferentes tipos, ya que por ejemplo 6 es diferente a “6” y si hacemos algo como “3” < “8” Lua dará un error ya que estamos mezclando los strings.
Operadores lógicos
Los operadores lógicos en Lua son el and, or y not. Cuando se realiza una comparación utilizando estos operadores, se retornará el primer argumento en el caso que sea falso, en el caso contrario retornará el segundo, veamos una serie de ejemplos en la consola interactiva para demostrar lo anterior mencionado.
Concatenación
Para realizar la concatenación en Lua es mediante los dos puntos, cambia un poco la sintaxis con respecto a otros lenguajes pero de igual forma es bastante simple, pero Lua siempre va un poco más allá y si se encuentra con algún número y existe una operación de concatenación el mismo lo convierte a un string, veamos dos ejemplos sencillos de esta operación:
Como vemos para el primer caso se realiza la operación sin ningún problema, y para el segundo caso que tenemos números, Lua los convierte automáticamente en string. Es importante recordar que los strings son inmutables por lo que esta operación siempre crea un nuevo string sin realizar ninguna modificación a su operando.
Constructores
Por último, tenemos los constructores, los cuales son expresiones que nos permiten crear e inicializar tablas, esta característica es única de Lua y es una de sus más mecanismos más versátiles y poderosos. Podemos utilizar un constructor vacío sin ningún problema con solo los corchetes {} el cual creará una tabla vacía como tal. Estos también pueden inicializar arreglos o listas, veamos un ejemplo:
dias = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"}Aquí creamos una lista con los días de la semana y si deseamos acceder a sus elementos con especificar el índice del mismo tenemos, por ejemplo para obtener el jueves sería el índice número 5 o el domingo sería el número 1, ya que Lua no inicializa en cero como el resto de los lenguajes, veamos como luce cuando lo ejecutamos en nuestra consola:
También podemos crear nuestro propios arrays asociativos del tipo llave valor:
arreglo = {x=26, y=67}
Pero es importante que para poder acceder a sus valores hagamos la referencia al índice con comillas dobles de resto obtendremos el valor nil, veamos nuestra operación en la consola interactiva:
Con esto damos por finalizado el tutorial, donde pudimos ver que Lua extiende su simplicidad a todas las aristas que lo componen, desde los tipos dinámicos que maneja, la forma sencilla de realizar asignaciones, el manejo de operadores relacionales y lógicos, además de brindarnos herramientas sumamente útiles como concatenaciones y los constructores para hacer de nuestra experiencia con el lenguaje lo más amena y agradable posible.