El artículo vinculado definitivamente lo hace bien sobre los N + 1/2 Loops de Donald Knuth . Expresado en C / C ++ / Java:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
Esto es útil para leer líneas o caracteres de un archivo, probar si ha alcanzado EOF y luego procesarlo. Estoy tan acostumbrado a ver for(;;)..if(..)break;
aparecer el patrón que es idiomático para mí. (Antes de leer el artículo de Knuth, reimpreso en el libro Literate Programming , este solía ser un "wtf?").
Knuth sugirió las palabras clave loop/while/repeat
:
loop:
S;
while C:
T;
repeat
Donde S
y T
son marcadores de posición para una serie de cero o más declaraciones, y C
es una condición booleana. Si no hubiera una S
declaración, entonces sería un ciclo while, y si no hubiera una T
declaración, sería un ciclo do.
Esta construcción en sí misma podría generalizarse permitiendo cero o más while C
cláusulas, haciéndola perfecta para expresar bucles infinitos y luego algunas condiciones más raras que necesitarían dos comprobaciones.
En el mismo artículo, Knuth sugirió un mecanismo de señalización que sería una versión local de lanzar / atrapar excepciones (como alternativa al uso de goto).
¿Para mi? Deseo que Java sea compatible con la optimización de llamadas de cola, para poder expresar cualquier estructura de control general según sea necesario.
Actualización: Olvidé mencionar que muchos programadores de C / C ++ / Java eluden este usando una asignación incrustada en la condición de while
:
while ((c = getc(f)) != -1) {
T;
}
El uso de los términos de constructo de Knuth, esto es admisible cuando S
y C
se pueden combinar en una sola expresión. Algunas personas odian ver la tarea incrustada arriba, mientras que otras odian verla break
en lo for (;;)
anterior. Pero cuando S
y C
no se pueden combinar, como cuando S
tiene múltiples declaraciones, esta for (;;)
es la única alternativa sin repetir el código. La otra alternativa es simplemente duplicar el S
código:
S;
while (C) {
T;
S;
}
La loop/while/repeat
alternativa de Knuth parece mucho mejor.