O artigo vinculado definitivamente esclarece os N + 1/2 Loops de Donald Knuth . Expressado em C / C ++ / Java:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
Isso é útil para ler linhas ou caracteres de um arquivo, testar se você atingiu o EOF e depois processá-lo. Estou tão acostumado a ver o padrão for(;;)..if(..)break;
aparecer que é idiomático para mim. (Antes de ler o artigo de Knuth, reimpresso no livro Literate Programming , este costumava ser um "wtf?".)
Knuth sugeriu as palavras loop/while/repeat
- chave :
loop:
S;
while C:
T;
repeat
Onde S
e T
são espaços reservados para uma série de zero ou mais instruções e C
é uma condição booleana. Se não houvesse uma S
instrução, seria um loop while e, se não houvesse uma T
instrução, seria um loop do.
Essa construção em si poderia ser generalizada, permitindo zero ou mais while C
cláusulas, tornando-a perfeita para expressar loops infinitos e, em seguida, algumas condições mais raras que precisariam de duas verificações.
No mesmo artigo, Knuth sugeriu um mecanismo de sinalização que seria uma versão local de exceções de lançamento / captura (como uma alternativa ao uso de goto).
Para mim? Desejo que a Java suporte a otimização de chamada de cauda, para que eu possa expressar qualquer estrutura de controle geral, conforme necessário.
Atualização: esqueci de mencionar que muitos programadores de C / C ++ / Java resolvem esse problema usando uma atribuição incorporada na condição de while
:
while ((c = getc(f)) != -1) {
T;
}
Usando os termos da construção de Knuth, isso é permitido quando S
e C
pode ser combinado em uma única expressão. Algumas pessoas odeiam ver a atribuição incorporado acima, enquanto outros odeiam ver o break
no for (;;)
acima. Mas quando S
e C
não pode ser combinado, como quando S
possui várias instruções, for (;;)
é a única alternativa sem repetir o código. A outra alternativa é simplesmente duplicar o S
código:
S;
while (C) {
T;
S;
}
A loop/while/repeat
alternativa de Knuth parece muito melhor.