Sintaxis esencial de Lua para desarrollo integrado

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"

Etiquetas: Lua embedded-scripting Table scripting-language

Publicado el 10-8 07:13