Pular para o conteúdo

2. Coleções, erros de alocação e genéricos

Coleções dinâmicas possuem alocações e podem falhar ao crescer. Reserve capacidade quando conhecida, mas preserve o erro: falta de memória não é um valor. Views emprestam o armazenamento e restringem movimentos, crescimento, substituição e destruição até seu último uso.

Genéricos especializam código verificado para tipos concretos. Type sets expressam operações aceitas; callables carregam comportamento em uma API. Comece concreto, torne explícito o tipo ou operação variável e examine diagnósticos no ponto de especialização. Não esconda propriedade ou alocação em nome da abstração.

Consulte coleções, arrays dinâmicos, genéricos e callables.

Exemplo testado

Componha callables tipados, relay genérico e valores capturados sem apagar seus contratos.

Arquivo: curriculum/main-evidence/single/callables.fl

curriculum/main-evidence/single/callables.fl
func Mapper(i32) => (i32);
func GenericMapper<T>(T) => (T);
structure Pipeline { Mapper callback; };
Pipeline Pipeline::init(Mapper callback) <- callback override {
return build Pipeline { self.callback = callback; };
}
i32 Pipeline::run(&const self, i32 value) {
return (self->callback)(value);
}
T relay<T>(T value) <- value { return value; }
Mapper offset(i32 amount) {
return [copy amount](value) => { return value + amount; };
}
Mapper combine([2]Mapper callbacks) <- callbacks {
return [own callbacks](value) => {
return (callbacks[0])(value) + (callbacks[1])(0);
};
}
i32 main() {
Mapper explicit = [](i32 value) => (i32) { return value * 2; };
Mapper inferred = (value) => { return value + 2; };
Pipeline pipeline = Pipeline::init(offset(20));
Mapper generic = relay<Mapper>(explicit);
GenericMapper<i32> specialized = (value) => { return value + 1; };
if generic(21) != 42 { return 1; }
if inferred(40) != 42 { return 2; }
if specialized(41) != 42 { return 4; }
[2]Mapper pending = [offset(10), offset(12)];
Mapper nested = combine(pending);
if nested(20) != 42 { return 3; }
return pipeline.run(22);
}

O bloco acima é o arquivo completo executado pelos comandos abaixo.

As assinaturas dos callables preservam tipos de parâmetros e resultados durante a composição. O relay genérico não apaga esses contratos, então funções incompatíveis ainda falham na verificação.

Comandos

Comandos
flecha check curriculum/main-evidence/single/callables.fl
flecha build curriculum/main-evidence/single/callables.fl -o build/callables
build/callables

Saída esperada

Saída esperada
(stdout vazio)
status de saída: 42

Referência relacionada: /examples/callables/.