Pular para o conteúdo

Blocos e janelas

O bloco que sabe dizer quando acabou, e a janela que lê e escreve sem copiar.

O bloco#

dataforge
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 fim

liberar() 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#

dataforge
j := Est.janela(arquivo, Registro, deslocamento := 8)

out j.ler("preco")
j.escrever("quantidade", 7)     // muda O BLOCO
j["ativo"] := yes               // o mesmo, por índice

Percorrer um arquivo de registros#

dataforge
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 blocoo resultado é um número plausível, e o defeito aparece três camadas adiante
um valor fora da faixa do tipoele é truncado em silêncio, e o arquivo sai com outro número
um campo que não existea escrita iria para lugar nenhum — a mensagem sugere o nome parecido
escrever num bloco somente leiturabytes não muda; a queixa sairia do Python, sobre outra coisa
usar um bloco liberadolê-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.