Recursión, bucles y tablas
En esta página
El compilador ejecuta un subconjunto completo del lenguaje: aritmética, control de flujo y llamadas a métodos en arrays y strings. Esto significa que la recursión y los bucles funcionan normalmente dentro de contextos comptime.
Recursión
Una @comptime fn puede llamarse a sí misma. El compilador evalúa la
recursión hasta el caso base y bake el resultado como literal. El tiempo de
ejecución nunca ve la pila de llamadas — solo el número final.
Fibonacci comptime: fib(10) y fib(15) baked directamente en el binario.
// Feature: comptime recursion — a `@comptime fn` calling itself
// Syntax: same as above; recursion is fine, but you must terminate.
// When to use: classic precomputed sequences (Fibonacci, factorials,
// CRC tables) — the runtime sees only the final number.
@comptime
fn fib(n: int) -> int {
if n <= 1 { return n }
return fib(n - 1) + fib(n - 2)
}
let f10 = comptime fib(10)
print(f10)
// expected: 55
let f15 = comptime fib(15)
print(f15)
// expected: 610
Bucles
Un for dentro de comptime { ... } se ejecuta íntegramente en el compilador.
La suma de Gauss de 1 a 100 es un ejemplo clásico: la respuesta siempre es 5050
y no hay motivo para calcularla en tiempo de ejecución.
Bucle comptime: suma 1..=100 en el compilador, el programa recibe el literal 5050.
// Feature: comptime loops — a `for` inside a comptime block
// Syntax: any control flow is fair game; the block runs in the
// compiler. The tail expression is the value baked in.
// When to use: precomputed sums, lookup tables, anything where the
// answer is known at build time and you want the binary to ship a
// literal instead of a loop.
// Gauss sum 1..=100, computed at build time.
let total = comptime {
var s = 0
for i in 1..=100 {
s = s + i
}
s
}
print(total)
// expected: 5050
Tablas de consulta
El mismo patrón sirve para generar arrays literales — tablas de cuadrados,
primos, CRC, paletas. Construye el array dentro del bloque, termínalo como
expresión de cola y el compilador emite [1, 4, 9, 16, 25, ...] directamente
en el binario.
Array de los cuadrados del 1 al 5 generado en tiempo de compilación.
// Feature: comptime arrays — emit a literal `[v1, v2, ...]`
// Syntax: build the array inside `comptime { ... }`, end with the
// array as the tail expression. The runtime sees a baked literal.
// When to use: lookup tables (squares, primes, lookup-by-index
// for hot paths), CRC tables, palette tables.
let squares = comptime {
var out = []
for n in 1..=5 {
out = out.push(n * n)
}
out
}
print(squares[0]) // expected: 1
print(squares[1]) // expected: 4
print(squares[2]) // expected: 9
print(squares[3]) // expected: 16
print(squares[4]) // expected: 25
Desafío
Adapta el ejemplo de la tabla para generar los 10 primeros múltiplos de 7 y
accede a squares[9] para confirmar el resultado.
Consulta también