defer programa un bloque de código para que se ejecute cuando la función que lo contiene retorna — sin importar cuál sentencia return se tome o si ocurre un error. Es la forma idiomática de garantizar la limpieza de recursos como manejadores de archivos, conexiones de red o locks.
// defer: garantizar cleanup al salir del bloque, como file_close fn main() -> int { let path: String = "/tmp/nyx_example_36.txt" let contenido: String = "Linea 1: Nyx defer example\nLinea 2: cleanup garantizado\n" // Escribir el archivo primero write_file(path, contenido) print("Archivo escrito: " + path) // Abrir el archivo con file_open let f: File = file_open(path, "r") // defer garantiza que file_close se ejecuta al salir, // sin importar si hay return temprano o error defer { file_close(f) } // Leer e imprimir el contenido let linea1: String = file_read_line(f) print("Leyendo: " + linea1) let linea2: String = file_read_line(f) print("Leyendo: " + linea2) print("El file_close se ejecutara automaticamente al salir") // file_close(f) es llamado aqui por defer return 0 }
Archivo escrito: /tmp/nyx_example_36.txt Leyendo: Linea 1: Nyx defer example Leyendo: Linea 2: cleanup garantizado El file_close se ejecutara automaticamente al salir
Cómo funciona
defer { file_close(f) } registra el bloque inmediatamente después de que el archivo se abre, pero el bloque en sí no se ejecuta hasta que la función está por retornar. Esto asegura que el archivo se cierre sin importar cómo la función termina — a través del return 0 normal, un retorno anticipado, o un error no capturado.
En Nyx, defer siempre requiere un bloque delimitado por { } — expresiones sueltas como defer file_close(f) no son válidas. Múltiples bloques diferidos en la misma función se ejecutan en orden inverso de registro (último en entrar, primero en salir), reflejando cómo funciona el desenrollado de la pila.
Este patrón está directamente inspirado en el defer de Go y elimina clases enteras de bugs de fuga de recursos que son comunes cuando la limpieza debe colocarse en cada punto de salida posible.