⌘ REFERENCIA · 204 elementos
Cheatsheet de Lua
El lenguaje entero en un sitio: valores, tablas, funciones, metatablas, objetos, corrutinas, módulos, errores y memoria. Busca por función o por el mecanismo que quieres entender.
🧭 Tipos, valores y números 15
nil, boolean, number, string, function, table, userdata y threadOcho tipos
El segundo revela el subtipo numérico que el primero ocultatype y math.type
El valor lo lleva encima; la variable solo lo sostieneLas variables no tienen tipo
El cero y la cadena vacía son verdaderos, sin excepciónSolo nil y false son falsos
Devuelven uno de sus operandos, no un booleanoand y or
Un valor de pleno derecho: asignarlo borra la clave por completonil
Ahí está la frontera entre valor e identidadCuatro se copian, cuatro se comparten
Un solo tipo number partido en dos subtipos: entero y flotanteEl cisma de 5.3
La barra siempre da flotante; la doble redondea hacia abajo/ frente a //
El módulo hereda el signo del divisor, no el del dividendo%
La potencia nunca devuelve un entero^
64 bits en complemento a dos: da la vuelta sin fallarDesbordamiento
Convierte solo si la conversión es exacta; math.floor convierte siempremath.tointeger
No es igual ni a sí mismo, y por eso no puede ser claveNaN
Funciona en la aritmética y falla como clave de tablaCoerción
🗂️ La tabla: la estructura única 15
Array, diccionario, objeto, módulo, conjunto y espacio de nombresUna sola estructura
Un vector para los enteros densos y una hash encadenada para el restoRepresentación dual
Solo nil y NaN; hasta una tabla o una función sirven de claveClaves prohibidas
El flotante con parte decimal nula se normaliza antes de buscar2.0 y 2
Lista posicional, clave con nombre y clave entre corchetes, mezclablesEl constructor
Se expande a todos sus valores; en medio, se recorta a unoLa última expresión
Devuelve una frontera, no un recuento, y le cuesta O(log n)El operador de longitud
Con un hueco la tabla deja de ser secuencia y la longitud mienteAgujero
No crece un poco: recuenta y redimensiona las dos partes de golpeEl rehash
La memoria vuelve en el próximo redimensionado, no al asignar nilBorrar no libera
Sin el relleno de alineación, una tabla grande baja al sesenta por cientoArrays compactos de 5.5
El elemento de clave y true de valor: pertenencia en tiempo constanteLa tabla como conjunto
Primero y último avanzan y no se desplaza ni un elementoLa cola con dos índices
Una tabla de despacho en lugar de la escalera de condicionalesRegistro de funciones
Copia rangos, también sobre la misma tabla, y respeta el solapamientotable.move
🧶 Cadenas y patrones 19
Cada concatenación fabrica una cadena nueva y enteraValor inmutable
Coste cuadrático; el patrón correcto acumula y hace table.concatConcatenar en un bucle
Las cortas comparten una copia: igualdad en tiempo constanteInternamiento
El precio que se paga por no cargar la tabla global de cadenasLas largas no se internan
Cuentan desde el final, y el menos uno es el último byteÍndices negativos
Cadena larga con niveles: ni escapes ni comillas que estorben[[ ]]
El motor de formateo; con %q el valor sale como Lua releíblestring.format
Lua trabaja con bytes: la biblioteca solo ayuda a recorrerlosutf8
Otro formalismo, nacido de una restricción de tamaño y portabilidadNo son expresiones regulares
Diez clases con su complemento en mayúscula; %w no incluye el guion bajo%a %d %s %w
Cualquier byte, salto de línea incluido: no hay modo multilíneaEl punto
Tres cuantificadores codiciosos y un único perezoso, el guion* + - ?
Afecta solo a la clase anterior, porque no existen los gruposEl cuantificador
Referirse dentro del patrón a una captura que ya se hizo%1
Un paréntesis vacío devuelve el índice, no el textoCaptura de posición
Coincidencia equilibrada y frontera: lo que no cabía en el formalismo%b y %f
Localizar, extraer, iterar y sustituir: las cuatro y ninguna másfind, match, gmatch, gsub
El reemplazo se puede consultar o calcular, no solo escribirgsub con tabla o función
Cuando la echas de menos, el sitio al que ir es LPegSin alternancia
🔧 Funciones, llamadas y varargs 16
No hay categoría sintáctica: se crea un valor y se guarda en algún sitioDeclarar es asignar
Declara primero y asigna después; sin eso no habría recursión directalocal function
De una tabla se copia la referencia, nunca la estructura apuntadaSiempre por valor
Los que faltan llegan nil y los que sobran se tiran, en silencioAjuste de aridad
Con un único argumento literal el paréntesis se puede omitirf{...} y f'...'
Azúcar que inserta el receptor como primer argumento, y nada másLos dos puntos
Una llamada no produce un valor sino una lista de longitud arbitrariaRetornos múltiples
Al final de una lista se expande; en cualquier otro sitio se recorta a unoLa regla de ajuste
El único contexto donde los paréntesis dejan de ser inertes: truncan(f())
Los argumentos variables, sujetos exactamente a la misma regla de ajuste...
Contar cuántos llegaron de verdad, incluidos los nil de en medioselect con almohadilla
Materializa con un campo n, porque la longitud no vale con agujerostable.pack
Novedad de 5.5: declarar la tabla directamente en los parámetrosTablas de varargs con nombre
No es una optimización sino una definición del manual: no consume pilaLlamada de cola
Un paréntesis, una suma pendiente o una variable de cierre por delanteQué la descalifica
Cada estado retorna al siguiente y corren para siempre en espacio constanteMáquinas de estados
🎒 Closures, ámbito y _ENV 18
Un prototipo compilado más el vector de variables externas que capturaToda función es un closure
Apunta a un hueco vivo de la pila mientras el bloque siga existiendoUpvalue abierto
Al salir del bloque el valor migra al montón y el puntero se reenganchaUpvalue cerrado
Dos closures del mismo ámbito ven exactamente la misma celdaCompartir estado
Estado verdaderamente privado, pagado en una función por campoEl objeto sin tabla
Lua no la sufre: cada iteración abre y cierra su propio bloqueLa trampa del bucle
La variable empieza a existir después de su propia declaraciónlocal
El límite por función que impone el compilador200 locales
No asignable, comprobado al compilar, y a veces ni llega a ocupar registro<const>
El RAII de Lua: __close al salir del bloque, también por error o break<close>
Un upvalue corriente: toda global es un campo suyo_ENV
No tiene nada de especial: es el valor inicial de _ENV_G
Leer un nombre libre es un acceso a tabla, no una lectura de registroEl coste de un global
El idioma de bajar la función de biblioteca al ámbito de la funciónCachear en local
Declararlas convierte el error tipográfico en error de compilaciónglobal de 5.5
La frontera real no es el nombre visible sino el objeto alcanzableSandbox
Enumerar y modificar capturas desde fuera del closuredebug.getupvalue
Comprobar si dos funciones comparten celda, y redirigir una capturaupvalueid y upvaluejoin
🪞 Metatablas y metamétodos 19
Una tabla que describe a otra: Lua expone el punto de decisiónLa idea
Instalar y leer, salvo que __metatable lo impidasetmetatable y getmetatable
Delegación: la búsqueda fallida sigue por el eslabón siguiente__index con tabla
Cálculo: la clave ausente se fabrica en el momento de pedirla__index con función
Solo se dispara con claves ausentes; reasignar no lo despierta__newindex
Tabla sin claves y almacén aparte, para que todo pase por los metamétodosEl proxy vacío
Puertas traseras obligatorias cuando el metamétodo toca su propia tablarawget y rawset
Longitud e igualdad sin pasar por __len ni por __eqrawlen y rawequal
__index calcula una vez y guarda; con tabla débil, sin filtrar memoriaMemoización
Gana el metamétodo del primer operando que lo tenga; no hay reflejadosAritméticos y __concat
Una tabla que se invoca como si fuera una función__call
Cómo se imprime tu tipo y cómo aparece en los mensajes de error__tostring y __name
Definir la propia longitud aunque la tabla tenga agujeros__len
Solo entre valores del mismo tipo, y solo si la identidad ya falló__eq
Se llaman con cualquier par; en 5.4 __le perdió su respaldo__lt y __le
Solo si estaba puesto al asignar la metatabla, y puede no correr nunca__gc
Cierre garantizado a la salida del bloque, sea cual sea esa salida__close
Convierte la tabla en observadora: claves o valores débiles__mode
Oculta y protege: ni se lee la metatabla ni se sustituye__metatable
🏛️ Objetos y herencia 12
Solo tablas, metatablas y una convención de llamadaNo hay clases
Una tabla que es clase y metatabla a la vez, con __index a sí mismaEl idioma de la clase
Crear la tabla vacía y ponerle la clase como metatablaEl constructor
En la declaración con dos puntos aparece solo; en la llamada, el receptorself
Mezclar el punto y los dos puntos, y quedarse sin receptorEl error clásico
Encadenar metatablas: la búsqueda sube un eslabón cada vez que fallaHerencia
Invocar su método pasándole el self del hijo a manoLlamar al padre
__index como función que recorre varias tablas en ordenHerencia múltiple
Cada eslabón es otra búsqueda fallida antes de acertarEl coste de la cadena
Campos como closures; el guion bajo es convención, no protecciónEncapsulación real
Vía intermedia: el estado aparte, con claves débiles para no retenerLa tabla privada
Composición explícita, o directamente ningún objetoCuándo no
➰ Iteradores y el for genérico 13
Función iteradora, estado invariante y variable de controlLa tripleta
Un valor de cierre que se cierra al abandonar el bucleEl cuarto valor
La lista de expresiones; después el bucle solo llama a la funciónSe evalúa una sola vez
El primer resultado nulo termina el bucle, sin más condiciónEl nil de parada
No recorre nada: devuelve next, la tabla y nilpairs
Fabrica un contador desde 1 y se rinde en el primer huecoipairs
Indefinido por construcción: depende de cómo se construyó la tablaEl orden de pairs
Función pura de estado y control: el más barato del lenguajeIterador sin estado
Un closure por bucle; ni reentrante ni reiniciableIterador con estado
Hace mentir a pairs, y por eso conviene pensárselo dos veces__pairs
Escribe solo el recorrido recursivo, y trae su propio costeIterador con corrutina
Filtros y transformaciones perezosas sin tablas intermediasComponer iteradores
Las variables del for dejan de poder asignarse dentro del cuerpoControl inmutable en 5.5
🔁 Corrutinas 16
Una línea de ejecución con pila propia que cede donde tú lo escribisteQué es
Devuelve el control a quien la reanudó, no a un planificadorAsimétrica
Nadie la interrumpe: sin carreras, y también sin paralelismoNo preemptiva
Alrededor de un kilobyte, y el cambio vale lo que una llamadaEl coste
Fabrica la corrutina y no ejecuta ni una sola líneacreate
Reanudar arranca o continúa; ceder devuelve a la suspensiónresume y yield
El primer resume alimenta los parámetros; los siguientes salen por yieldCuatro canales
suspended, running, dead y normal, la que reanudó a otra y esperaCuatro estados
No se propaga: mata la corrutina y sale por el primer valor de resumeUn error dentro
Invierte esa decisión y vuelve a lanzar el error al llamantecoroutine.wrap
Para lo que quedó suspendido y nadie va a reanudar jamáscoroutine.close
El Lua clásico no puede suspender un marco de C por debajoLa frontera de C
Producir bajo demanda sin materializar nunca la secuencia enteraGeneradores
Sin cola intermedia el control de flujo sale gratisProductor y consumidor
Cola de listas, bucle que reanuda y temporizadores ordenados por plazoUn planificador
Ceder esperando, y que la llamada de vuelta reanude al llegarEl await que te fabricas
📦 Módulos y require 14
Un chunk cuyo valor de retorno alguien guarda en un cachéUn módulo es convención
Ni import ni namespace: una función de biblioteca sostiene todo el sistemaSin palabra clave
Mirar el caché, buscar cargador, ejecutarlo y anotar el resultadoLas cuatro fases
El caché, y la razón exacta de que un módulo sea un singleton del procesopackage.loaded
Registrar un cargador a mano, antes de tocar el discopackage.preload
Una lista ordenada, y de su orden salen todas las precedenciasLos buscadores
Plantillas con interrogante donde entra el nombre ya traducidopackage.path
Lo mismo para bibliotecas en C, con su función de aperturapackage.cpath
Anuncia el separador de directorios de la plataformapackage.config
Y vaciar el caché a mano deja referencias viejas sueltas por ahírequire nunca recarga
Declararla arriba, rellenarla y devolverla en la última líneaLa tabla local
Los require arriba se ven de un vistazo y quedan en localesDependencias en la cabecera
Lo compartes con todo el proceso, lo hayas pensado o noEstado en el módulo
El cuarto argumento carga el chunk con su propio _ENVloadfile con entorno
💥 Errores: error y pcall 12
Ni jerarquía ni sintaxis de captura: una función que lanza y otra que protegeSin excepciones
Lanza cualquier valor, no solo una cadenaerror
Decide qué línea se culpa, y la posición solo se añade a las cadenasEl nivel
No es azúcar sintáctico: sus argumentos se evalúan en cada vueltaassert
Ejecuta en modo protegido y antepone un booleano al resultadopcall
Su manejador corre antes de desenrollar: de ahí sale el único rastro útilxpcall
Devolver nil y un mensaje cuando el fallo era previsibleEl idioma del nil
Cuando quien llama no puede hacer nada con el falloCuándo lanzar
Se convierten la una en la otra con pcall o con assertLas dos convenciones
Relanzar envolviendo, sin destruir el mensaje originalAñadir contexto
La limpieza va en un <close> o después del pcallSin bloque final
No se maneja de nuevo: se pierde el primero, que era el importanteError dentro del manejador
📚 Biblioteca estándar y ecosistema 15
Todo el catálogo cabe en una lección, y eso es la tesis del lenguajeNueve bibliotecas
Ni JSON, ni sockets, ni regex, ni hilos, ni criptografíaLo que no trae
Lo que no se puede escribir en C portable se queda fueraPor qué falta
Un objeto con metatabla, no un descriptor desnudoEl manejador de fichero
io.read e io.write llevan dos variables globales ocultas detrásFicheros por defecto
El único de la biblioteca que se ocupa de cerrar por tiio.lines
Tiempo de proceso para medir, tiempo civil para fecharos.clock frente a os.time
Devuelve cómo terminó, no lo que imprimió: para eso está io.popenos.execute
Lua no escapa argumentos: valida contra una lista o no lo usesInyección de órdenes
Desde 5.4 es xoshiro propio: misma semilla, misma secuencia en cualquier sitiomath.random
Con rango descarta y vuelve a tirar en lugar de calcular un restoSin sesgo de módulo
Sirve para comprobar sintaxis y estudiar bytecode; portabilidad no prometeluac
LuaJIT se quedó ahí y el ecosistema quedó partido en dos mundosEl cisma de 5.1
Política deliberada: el tamaño se paga en compatibilidadRomper entre versiones
Árboles por versión, y el criterio de copiar el fichero y seguirLuaRocks
🧬 Metaprogramación y el recolector 20
El compilador expuesto como función corriente: de texto a chunk ejecutableload
Y lleva _ENV en su primer upvalue, siempreEl chunk es vararg
Fija ese _ENV: de ahí salen la configuración como código y el sandboxEl cuarto argumento
El modo de load es una decisión de seguridad, no de comodidadTexto o binario
Gobierna lo que vas a leer en el mensaje de errorEl nombre del chunk
Vuelca el bytecode de una función; de vuelta, las funciones no viajanstring.dump
La base de serializar: escribe el valor como Lua que se puede releer%q
Dos fases: declarar las tablas y después coserlas entre síCiclos e identidad
Quién llamó y desde qué línea, sin instrumentar nadadebug.getinfo
Ganchos de llamada, retorno, línea y cuenta: la base de un profilerdebug.sethook
No cuenta referencias: sigue caminos desde las raícesMarcado y barrido
Blanco sin visitar, gris pendiente, negro terminadoTres colores
Ningún objeto negro apunta a uno blanco, o se pierde algo vivoEl invariante tricolor
El precio obligatorio de trocear el ciclo en pasosBarrera de escritura
Contar, forzar, dar un paso, detener y afinar los parámetroscollectgarbage
Los recién nacidos se revisan a menudo; los veteranos casi nuncaGeneracional
Las recolecciones mayores pasan a ser incrementales: sin pausa catastróficaEl cambio de 5.5
Observan sin retener: cachés que sí dejan liberarTablas débiles
Resuelven el ciclo en que la clave solo se alcanza desde su valorEfímeros
Un finalizador puede devolver el objeto al mundo de los vivosResurrección