Palabras clave en Zig – Guía completa
En el lenguaje de programación Zig, las palabras clave son identificadores reservados que tienen un significado especial para el compilador. No pueden ser usados como nombres de variables, funciones, tipos o cualquier otro identificador en tu código. Cada keyword define una construcción sintáctica o semántica que el compilador interpreta de manera particular.
Concepto básico de palabras clave
Las palabras clave de Zig se utilizan para:
- Declarar variables y constantes.
- Definir funciones y estructuras.
- Controlar el flujo del programa (condicionales, bucles, etc.).
- Gestionar el tiempo de compilación y la ejecución.
- Especificar atributos y comportamiento del código.
Lista de palabras clave más comunes
- var
- const
- fn
- comptime
- inline
- defer
- errdefer
- errreturn
- switch
- if
- while
- for
- break
- continue
- return
- unreachable
- noalias
- suspend
- test
- export
- extern
- error
- struct
- union
- enum
- type
- alias
Ejemplos de uso detallados
1. Declaración de constantes y variables
// Constante: el valor se evalúa en tiempo de compilación y no puede cambiar
const pi = 3.14159; // No se puede re-asignar
// Variable: el valor puede cambiar a lo largo de la ejecución
var count: u32 = 0; // 'u32' indica un entero sin signo de 32 bits
2. Función básica y uso de ‘fn’
// Declaración de una función que devuelve la suma de dos enteros
fn add(a: i32, b: i32) i32 {
return a + b; // Devuelve el resultado de la suma
}
// Llamada a la función y almacenamiento del resultado
var result = add(5, 7); // result = 12
3. Evaluación en tiempo de compilación con ‘comptime’
// Función recursiva para calcular el factorial, evaluada en tiempo de compilación
comptime fn factorial(n: u8) u64 {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
// Se asigna el factorial de 5 a una constante
const fact5 = factorial(5); // fact5 = 120
4. Uso de 'defer' y 'errdefer' para manejo de recursos
const std = @import("std");
fn readFileContent() !void {
// Abrir un archivo; si falla, el error será propagado
var file = try std.fs.cwd().openFile("datos.txt", .{ .read = true });
// 'defer' garantiza que file.close() se ejecute al salir de la función,
// sin importar si la salida es exitosa o un error
defer file.close();
var buffer: [1024]u8 = undefined;
const bytesRead = try file.readAll(&buffer);
// Imprimir el contenido leído
std.debug.print("Leído {} bytes: {s}\n", .{ bytesRead, buffer[0..bytesRead] });
}
// Ejemplo de función que usa 'errdefer' para asegurar la limpieza
fn processFile() !void {
var file = try std.fs.cwd().openFile("datos.txt", .{ .write = true });
// Si la apertura falla, 'errdefer' garantiza el cierre
errdefer file.close();
try file.writer().print("Escribiendo algo\n", .{});
// Normalmente el cierre se hace en 'defer', pero 'errdefer' cubre el caso de error
defer file.close();
}
5. Control de flujo: 'switch', 'if', 'while' y bucles
// Uso de 'switch' para manejar diferentes casos
const day = 3;
const name = switch (day) {
0 => "Domingo",
1 => "Lunes",
2 => "Martes",
3 => "Miércoles",
4 => "Jueves",
5 => "Viernes",
6 => "Sábado",
else => "Día inválido",
};
// Condicional 'if' con bloque 'else'
if (name == "Miércoles") {
std.debug.print("Hoy es mitad de semana!\n", .{});
} else {
std.debug.print("No es mitad de semana.\n", .{});
}
// Bucle 'while' que cuenta hasta 10
var i: i32 = 0;
while (i < 10) : (i += 1) {
if (i % 2 == 0) continue; // Saltar los números pares
std.debug.print("Número impar {} es impreso.\n", .{i});
if (i == 7) break; // Salir del bucle cuando i sea 7
}
6. Funciones en línea con 'inline'
// Función 'inline' que
