Pular para o conteúdo

Recursão, laços e tabelas

Nesta página

O compilador executa um subconjunto completo da linguagem: aritmética, controle de fluxo, chamadas de método em arrays e strings. Isso significa que recursão e laços funcionam normalmente dentro de contextos comptime.

Recursão

Uma @comptime fn pode chamar a si mesma. O compilador avalia a recursão até a base e bate o resultado como literal. O tempo de execução nunca vê a pilha de chamadas — só o número final.

Fibonacci comptime: fib(10) e fib(15) baked diretamente no binário.

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

Laços

Um for dentro de comptime { ... } executa inteiramente no compilador. A soma de Gauss de 1 a 100 é um exemplo clássico: a resposta é sempre 5050 e não há motivo para calculá-la em tempo de execução.

Laço comptime: soma 1..=100 no compilador, o programa recebe o 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

Tabelas de consulta

O mesmo padrão serve para gerar arrays literais — tabelas de quadrados, primos, CRC, paletas. Construa o array dentro do bloco, termine com ele como expressão de cauda e o compilador emite [1, 4, 9, 16, 25, ...] diretamente no binário.

Array dos quadrados de 1 a 5 gerado em tempo de compilação.

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

Desafio

Adapte o exemplo de tabela para gerar os 10 primeiros múltiplos de 7 e acesse squares[9] para confirmar o resultado.

Buscar no Zolo

9 resultados

enespt-br