do
A função do em Scheme é um mecanismo de loop que permite iteração com inicialização, atualização e condições de término. É especialmente útil quando você precisa executar uma sequência de operações um número específico de vezes ou até que uma condição seja atendida.
A forma geral de do é:
(do ((var1 init1 update1)
(var2 init2 update2)
(var3 init3 update3))
(termination-condition result)
body)- Variable: A(s) variável(is) do loop.
- Valor inicial: O valor inicial de cada variável do loop.
- Expressão de atualização: A expressão que atualiza a(s) variável(is) do loop ao final de cada iteração.
- Condição de término: A condição para parar o loop.
- Expressão de resultado: O valor retornado quando o loop termina.
- Body: O código executado em cada iteração.
Exemplo: somar os números de 1 a 5
(do ((i 1 (+ i 1)) ; Inicializar i em 1, incrementar de 1
(sum 0 (+ sum i))) ; Inicializar sum em 0, adicionar i a sum
((> i 5) sum) ; Terminar quando i > 5, retornar sum
(lumi-message (number->string sum))) ; Imprime a soma a cada passo- A variável do loop
icomeça em 1 e incrementa de 1 a cada iteração. - A variável
sumacumula a soma dei. - O loop termina quando
i > 5, retornando o valor final desum.
Saída: 15
Como funciona
Inicialização:
- Cada variável do loop recebe seu valor inicial.
Verificação de término:
- No início de cada iteração, a condição de término é verificada. Se for verdadeira, o loop para e a expressão de resultado é avaliada.
Iteração:
- Se a condição de término for falsa, o corpo é executado e as variáveis do loop são atualizadas com suas respectivas expressões de atualização.
Resumo
- A construção
dooferece uma forma flexível de implementar loops com múltiplas variáveis e condições de término complexas. - É útil para tarefas que exigem atualizações de estado entre iterações.
- A condição de término determina quando o loop termina e pode retornar um resultado final.
Com do, você pode implementar algoritmos iterativos em Scheme com controle preciso sobre inicialização, atualizações e término. Isso faz de do uma combinação de um mecanismo de ligação com escopo (como let) e uma estrutura de controle iterativa, permitindo lidar com loops e estado temporário de forma limpa e concisa.