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
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
flecha check curriculum/main-evidence/single/callables.flflecha build curriculum/main-evidence/single/callables.fl -o build/callablesbuild/callablesSaída esperada
(stdout vazio)status de saída: 42Referência relacionada: /examples/callables/.