Lua es un lenguaje de scripting ligero, rápido y altamente portable, concebido específicamente para ser incrustado en aplicaciones escritas en C, C++, Rust u otros lenguajes de sistema. Su intérprete mínimo ocupa menos de 1 MB tras la compilación, lo que lo hace ideal para entornos con restricciones de recursos, como dispositivos embebidos, servidores web ligeros o motores de juegos.
Aplicaciones típicas
- Juegos: Control de IA, scripts de mitiones y personalización de comportamientos sin recompilar el motor.
- Servicios de red: Nginx (con OpenResty), Redis (módulo Lua), Wireshark (filtros personalizados).
- Configuración dinámica: Reemplazo de archivos JSON/YAML cuando se requiere lógica condicional o cálculos en tiempo real.
Declaraciones y tipos básicos
-- Salida estándar
io.write("Hola desde Lua\n")
-- Variables: por defecto son globales
contador = 42
mensaje = "Lua es expresiva"
-- Variables locales: limitadas al ámbito actual (función, bloque)
local umbral = 100
local lista = {1, "dos", true}
-- Variables no inicializadas valen nil
print(estado_desconocido) -- imprime: nil
-- Asignación múltiple simultánea
x, y, z = 10, "Lua", 3.14
-- Números: solo un tipo numérico (double por defecto), soporta decimal, hexadecimal y notación científica
base_decimal = 255
base_hex = 0xFF -- equivalente a 255
notacion_cientifica = 6.02e23 -- constante de Avogadro
-- Operadores aritméticos comunes
print(base_decimal + base_hex) -- 510
print(2 ^ 8) -- 256 (potenciación con ^)
Cadenas de texto
-- Delimitadores flexibles: comillas simples o dobles
nombre = 'Lua'
version = "5.4"
-- Secuencias de escape y cadenas multilínea con corchetes dobles
saludo = "Hola\tMundo\n"
texto_largo = [[
Línea uno
Línea dos
Línea tres
]]
-- Concatenación con el operador ..
frase_completa = nombre .. " v" .. version -- "Lua v5.4"
-- Conversión entre tipos
numero_str = tostring(999)
cadena_num = tonumber("42") -- 42
cadena_invalida = tonumber("42abc") -- nil
-- Longitud de cadena con operador #
print(#frase_completa) -- 9
Funciones
-- Sintaxis tradicional
function saludar(nombre, saludo)
return saludo .. ", " .. nombre .. "!"
end
-- Función anónima asignada a variable
multiplicar = function(a, b)
return a * b
end
-- Llamadas
print(saludar("Ana", "Hola")) -- "Hola, Ana!"
print(multiplicar(7, 8)) -- 56
-- Retorno múltiple (no tuplas: es una característica del lenguaje)
function descomponer(n)
return n // 10, n % 10
end
decenas, unidades = descomponer(87) -- decenas=8, unidades=7
Estructuras de datos: tablas
Las tablas son el único mecanismo de agrupación en Lua: sirven como arrrays, diccionarios, objetos y clases.
-- Tabla como array (índices numéricos empiezan en 1)
colores = {"rojo", "verde", "azul"}
-- Acceso y modificación
print(colores[1]) -- "rojo"
colores[4] = "amarillo" -- inserción por índice
-- Tabla como mapa (clave-valor)
config = {
puerto = 8080,
modo = "producción",
["ruta-base"] = "/api/v1"
}
print(config.puerto) -- 8080
print(config["ruta-base"]) -- "/api/v1"
-- Métodos útiles del módulo table
table.insert(colores, "morado") -- añade al final
table.remove(colores, 2) -- elimina el segundo elemento
-- Claves arbitrarias: incluso funciones o tablas
config.iniciar = function()
print("Servidor listo")
end
config.iniciar() -- ejecuta la función
Ámbitos y tabla global _G
-- Todas las variables globales residen en la tabla _G
usuario = "invitado"
print(_G.usuario) -- "invitado"
print(_G["usuario"]) -- equivalente
-- El módulo table también es una clave global
print(_G.table == table) -- true
Lógica condicional y valores falsy
En Lua, solo nil y false son considerados falsos. Todo lo demás —incluyando 0, cadenas vacías y tablas vacías— es verdadero.
if 0 then
print("Esto sí se ejecuta") -- ¡verdadero!
end
if {} then
print("Incluso una tabla vacía es truthy")
end
-- Operadores lógicos devuelven operandos, no booleanos
valor = false or "por defecto" -- "por defecto"
valor = 0 and "sí" or "no" -- "sí" (porque 0 es truthy)
-- Negación siempre devuelve booleano
print(not nil) -- true
print(not 0) -- false
Estructuras de control
-- if-elseif-else
local puntuacion = 85
if puntuacion >= 90 then
print("Sobresaliente")
elseif puntuacion >= 75 then
print("Notable")
else
print("Aprobado")
end
-- Bucle for numérico: inicio, fin, paso (opcional)
for i = 1, 5 do
io.write(i .. " ")
end -- imprime: 1 2 3 4 5
for j = 10, 1, -2 do
print(j)
end -- imprime: 10 8 6 4 2
-- while con ruptura anticipada
local k = 1
while k <= 10 do
if k == 4 then break end
print(k)
k = k + 1
end -- imprime: 1 2 3
Manipulación de caracteres
-- Conversión entre bytes y caracteres
caracter = string.char(65, 66, 67) -- "ABC"
primer_byte = string.byte(caracter, 1) -- 65 ('A')
-- Útil para protocolos binarios o procesamiento de bytes
hex_data = string.char(0x48, 0x65, 0x6C, 0x6C, 0x6F) -- "Hello"