Saltar al contenido

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.

03-recursion.zolo
Playground
// 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.

04-loop-precompute.zolo
Playground
// 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.

05-array-table.zolo
Playground
// 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.

Buscar en Zolo

9 resultados

enespt-br