comptime
A conta feita uma vez, na carga, e congelada: tabela gerada, constante calculada e validação que falha antes da primeira linha rodar.
comptime marca o que é calculado antes de o programa começar. O resultado vira constante, e a validação que falhar ali derruba a carga — não a primeira requisição em produção.
dataforge
comptime QUADRADOS := [i * i cycle i in range(0, 6)]
comptime steady MAXIMO := 2 ** 10
assert QUADRADOS is [0, 1, 4, 9, 16, 25]
assert MAXIMO is 1024Bloco, com ação própria#
A tabela de consulta é o caso clássico: a conta é cara, a resposta é sempre a mesma, e ninguém quer pagá-la a cada chamada.
dataforge
comptime:
action fatorial(n):
yield 1 given n smaller_eq 1 otherwise n * fatorial(n - 1)
TABELA := [fatorial(i) cycle i in range(0, 6)]
LIMITE := TABELA[5]
assert TABELA is [1, 1, 2, 6, 24, 120]
assert LIMITE is 120Validação estática#
Um assert dentro de comptime é uma trava de build: o dataforge check a executa e acusa com o código comptime-falhou, antes de rodar.
dataforge
comptime TABELA := [1, 2, 3]
comptime:
assert len(TABELA) is 3 // se mudar, o check acusa
assert len(TABELA) is 3A caixa: o que não entra#
Se comptime pudesse fazer E/S, "tempo de compilação" seria só "mais cedo". O corpo é varrido antes de rodar, e o que não é conta é recusado com o motivo.
| Recusado | Por quê |
|---|---|
out | escrever na saída durante a carga confunde o que é programa com o que é build |
adopt | módulo traz E/S; a conta de build não depende de disco, rede nem relógio |
thread e parallel | deixaria trabalho correndo por baixo de um programa que ainda não começou |
in (ler da entrada), wait, server, ignite | o mesmo motivo: pertencem ao programa |
dataforge
monitor:
// este bloco é recusado na carga
assert yes
handle Error as e:
assert no
comptime SEGURO := 2 + 2
assert SEGURO is 4O que isto não é#
| Não existe | Por quê |
|---|---|
| geração de código de máquina em build | não há compilação para binário: o DataForge interpreta a árvore |
| especialização de código por tipo | o caminho aqui é overload, que decide na chamada, e a macro, que reescreve o corpo |
| geração de tipos em compile-time | o que existe é type Par<T> := … (alias genérico) e Vetor<3> (argumento numérico) |
comptime dentro de uma ação | ele é declaração de topo: uma conta de build presa a uma chamada seria uma conta de execução com outro nome |