Menu

Laços while em Zero: iteração na linguagem agent-first

Como laços while funcionam em Zero hoje: a condição, o corpo do laço, a ausência de for e do-while na linguagem inicial e o que laços têm a ver com efeitos explícitos.

Esta página tem editores executáveis — edite, execute e veja a saída na hora.

O básico

while roda o corpo enquanto uma condição bool se mantiver true:

while condição {
    // corpo
}

O compilador avalia a condição antes de cada iteração:

  • true — roda o corpo e checa de novo.
  • false — sai do laço.

Uma ilustração trivial dos exemplos do Zero, com uma condição que já é false:

Rode isso e só o segundo write dispara. O corpo do while nunca executa porque a condição era false na primeira vez que foi checada.

A condição é um bool

Como em if/else, a condição do laço precisa ser um bool. Zero não converte inteiros, strings ou outros valores em booleanos.

while count {              // erro de compilação
    // ...
}

while count > 0 {          // OK
    // ...
}

A condição pode ser qualquer coisa que avalie para bool: uma ligação, uma comparação, uma combinação &&/|| ou uma chamada de função. Valem as mesmas regras do if.

Laços contados

O clássico "faça algo N vezes" usa um contador e um while:

let mut i = 0
while i < 10 {
    // faça trabalho
    i = i + 1
}

Três peças: um valor inicial, uma condição que compara contra um limite e uma atualização no corpo. É o padrão que toda linguagem imperativa tem — Zero só não enfeita com uma palavra-chave for.

Uma nota sobre o mut acima: como o Zero escreve ligações mutáveis na sua versão da toolchain pode variar em versões pré-1.0. Rode zero check --json contra um teste pequeno para confirmar a sintaxe exata que o seu compilador aceita. O padrão conceitual (contador + condição + atualização) é a parte que é estável.

Laços infinitos

Um while cuja condição é sempre true roda para sempre:

while true {
    // espera trabalho, trata, volta a iterar
}

Essa é a forma certa para um loop de eventos, um REPL ou um servidor de longa duração. Para sair, você termina o processo, lança um erro a partir do corpo ou reestrutura para quebrar a condição.

Quando recorrer a um laço

Laços são uma ferramenta para usar com parcimônia. Coisas que parecem laços em outras linguagens muitas vezes têm uma forma mais limpa em Zero:

  • Iterar sobre uma coleção fixa: prefira uma função que a biblioteca padrão ou o seu shape exponha — um helper estilo forEach, um folder ou uma travessia recursiva.
  • Ler até o fim da entrada: itere sobre uma leitura falível, mas use check e raises para tratar a fronteira de forma limpa em vez de aninhar flags de status.
  • Pollar por uma condição: considere se o design deveria te entregar um sinal. Laços de polling são um cheiro ruim em qualquer linguagem de sistemas.

O mesmo instinto vale para agentes: uma forma compacta e declarativa é mais fácil de raciocinar do que um laço com contador escrito à mão, tanto para humanos quanto para geradores de código.

Laços e efeitos

O corpo de um while, como qualquer outro bloco, pode fazer I/O — mas só se tiver acesso a uma capacidade World (ou a uma fatia dela). Uma função cuja assinatura não menciona World pode iterar à vontade mas não consegue escrever nada para fora. Essa propriedade vale dentro do corpo do laço também; o laço não concede nenhuma capacidade nova.

Soa óbvio, mas é por isso que você pode colocar um while dentro de uma função de computação "pura" e ainda saber — só pela assinatura — que ela não pode imprimir nada nem escrever em disco.

Notas de estilo

Alguns hábitos pequenos que compensam:

  • Mantenha a condição óbvia. Se a condição está fazendo trabalho de verdade, mova para uma função ou ligação nomeada para o laço ler de forma limpa.
  • Atualize o contador no final do corpo, não espalhado por ele. Bugs de off-by-one são mais fáceis de achar assim.
  • Prefira condições de saída antecipada que você consegue expressar como a própria condição do laço, em vez de flags que mudam no meio da iteração. Menos peças móveis.

A seguir: shapes

Você já viu o controle de fluxo básico do Zero. O próximo capítulo é sobre modelagem de dados — começando pelos shapes, os tipos produto do Zero, parecidos com structs.

Perguntas frequentes

Como laços while funcionam em Zero?

Use while condição { ... }. A condição é avaliada antes de cada iteração; se for true, o corpo roda e o laço checa de novo. Se for false, o laço sai e a execução continua depois da chave de fechamento. A condição precisa ser um bool.

O Zero tem laço for?

O Zero inicial traz while como única construção de laço. A linguagem mantém a superfície pequena deliberadamente enquanto estabiliza — menos palavras-chave significam menos formas de um agente escolher a errada. Um for sobre uma faixa ou coleção pode chegar depois; até lá, você constrói o mesmo padrão com while e um contador.

Como você escreve um laço contado em Zero?

Inicialize um contador, rode um while em cima dele e atualize dentro do corpo: let mut i = 0; while i < 10 { ...; i = i + 1 }. A sintaxe de mutabilidade ainda está evoluindo no Zero pré-1.0, então confira a documentação atual para a grafia exata — mas o padrão de while + contador + atualização é o idiomático para laços contados.

Existe break ou continue em Zero?

A maioria das linguagens da família do Zero traz alguma construção de saída antecipada de laço; a grafia exata no Zero pré-1.0 é uma das áreas que pode mudar antes da 1.0. A abordagem conservadora é estruturar o laço para que a própria condição faça o trabalho — inverta e atualize a condição para que o laço saia naturalmente — em vez de depender de uma palavra-chave específica de controle de fluxo.

Um laço while em Zero pode rodar para sempre?

Sim — while true { ... } é um laço infinito. Útil para servidores, loops de eventos, REPLs, qualquer coisa em que não há condição natural de término. Diferente do truthiness implícito, true aqui é um literal do tipo bool, então a condição continua bem-tipada.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR