Pular para o conteúdo

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 1024

Bloco, 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 120

Validaçã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 3

A 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.

RecusadoPor quê
outescrever na saída durante a carga confunde o que é programa com o que é build
adoptmódulo traz E/S; a conta de build não depende de disco, rede nem relógio
thread e paralleldeixaria trabalho correndo por baixo de um programa que ainda não começou
in (ler da entrada), wait, server, igniteo 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 4

O que isto não é#

Não existePor quê
geração de código de máquina em buildnão há compilação para binário: o DataForge interpreta a árvore
especialização de código por tipoo caminho aqui é overload, que decide na chamada, e a macro, que reescreve o corpo
geração de tipos em compile-timeo que existe é type Par<T> := … (alias genérico) e Vetor<3> (argumento numérico)
comptime dentro de uma açãoele é declaração de topo: uma conta de build presa a uma chamada seria uma conta de execução com outro nome