1. Contratos de propriedade e builds determinísticos
APIs avançadas devem declarar se uma entrada é emprestada, consumida, retornada ou retida. Aplique contratos de propriedade na menor fronteira e teste sucesso, falha de validação, falha de alocação e inicialização parcial. Um método de ciclo de vida não justifica transferência ambígua.
Builds determinísticos começam antes da geração de código. Fixe versões de Flecha e Longbow, versione lockfiles, verifique checksums, ordene entradas antes de serializar e exclua paths e tempos do host que não sejam entradas declaradas. Reconstrua com cache limpo e compare o artefato relevante.
Use contratos de propriedade, ecossistema de pacotes e geração nativa como listas de auditoria.
Exemplo testado
Coloque propriedade da alocação, construção, destruição e transferência em um contrato auditável.
Arquivo: curriculum/main-evidence/single/ownership_contracts.fl
structure Box { own *i32 value; };unsafe Box Box::init(own *i32 value) override { return build Box { self.value = value; };}unsafe void Box::tear(&self) override { free(self->value); }unsafe i32 Box::get(&const self) { if self->value == null { return 0; } return *self->value; }unsafe void consume(own *i32 p) { free(p); }unsafe (own *i32, error) create() { return new<i32>(42); }i32 main() { unsafe { p, e := create(); if e != none { return 1; } box := Box::init(p); return box.get(); }}O bloco acima é o arquivo completo executado pelos comandos abaixo.
Alocação, inicialização, transferência e destruição ocorrem sob um contrato de propriedade. Manter essas operações juntas torna visível o ponto em que a responsabilidade muda para o compilador e para a revisão.
Comandos
flecha check curriculum/main-evidence/single/ownership_contracts.flflecha build curriculum/main-evidence/single/ownership_contracts.fl -o build/ownership_contractsbuild/ownership_contractsSaída esperada
(stdout vazio)status de saída: 42Referência relacionada: /examples/ownership_contracts/.