Blocos e janelas
O bloco que sabe dizer quando acabou, e a janela que lê e escreve sem copiar.
O bloco#
b := Est.bloco(64) // 64 bytes zerados
c := Est.de_bytes(dados) // a partir do que já existe
out len(b)
b.liberar() // marca o fimliberar() não devolve memória ao sistema — quem faz isso é o CPython. O que ele faz é marcar: a partir dali, toda janela e todo ponteiro sobre este bloco levantam em vez de ler. É idempotente, como o soltar do Arcane.Posse: um liberar no defer e no caminho de erro não pode virar erro.
A janela não copia#
j := Est.janela(arquivo, Registro, deslocamento := 8)
out j.ler("preco")
j.escrever("quantidade", 7) // muda O BLOCO
j["ativo"] := yes // o mesmo, por índicePercorrer um arquivo de registros#
linhas := Est.janelas(arquivo, Registro,
deslocamento := Cabecalho.tamanho)
cycle linha in linhas:
out linha.ler("id"), linha.ler("preco")Sem quantos, ele devolve quantos couberem. Pedir mais do que cabe é erro, com a conta na mensagem: cabem 2 registro(s) de 'Par' aqui, e foram pedidos 5. E j.proxima() anda um registro, para quem prefere o laço explícito.
O que é recusado#
| Sem a recusa | |
|---|---|
| ler além do fim do bloco | o resultado é um número plausível, e o defeito aparece três camadas adiante |
| um valor fora da faixa do tipo | ele é truncado em silêncio, e o arquivo sai com outro número |
| um campo que não existe | a escrita iria para lugar nenhum — a mensagem sugere o nome parecido |
| escrever num bloco somente leitura | bytes não muda; a queixa sairia do Python, sobre outra coisa |
| usar um bloco liberado | lê-se o que ocupou o espaço depois |
A faixa vem do tipo declarado, e não do struct do Python: um u8 vai de 0 a 255, e não 'B' format requires 0 <= number <= 255 — quem escreveu u8 não tem como ligar uma coisa à outra.