Маленькое дополнение по поводу синтаксического сахара.
Когда Кнут рассуждает об обобщенном цикле, то он приводит не тот вид, который я привел в начале темы:
Код:
цикл
последовательность команд Х
что-нибудь типа exit или break по условию
последовательность команд Y
конец цикла
а, по сути, такой (опять перевру Кнута для удобства
)
Код:
цикл
X;
пока Условие
Y;
конец цикла
Я сначала недооценил тот факт, что во втором варианте используется условие продолжения цикла, а не условие выхода из цикла, как в первом. Причина этой недооценки - мышление в терминах реализации через exit/break, да и реализация цикла в Аде сыграла свою отрицательную роль.
Проблема вот в чем. Как уже упоминалось, условие с выходом можно перемещать вверх/вниз, получая граничные случаи: цикл типа
while и цикл типа
repeat..until. При этом, в верхнем положении нужно использовать условие продолжения цикла, а если смещать условие вниз, то нужно использовать его отрицание - для выхода. Как показывает практика, это очень неудобно. Гораздо удобнее и логичнее двигать именно
while вверх/вниз без всяких отрицаний в определенных положениях.
То есть, в "правильном" языке конструкция для обобщенного цикла должна быть именно такого вида:
Код:
цикл
X;
пока Условие
Y;
конец цикла
Из этих соображений, кстати, видна порочность конструкции
repeat..until. При моей общей нелюбви к С, должен признать, что там используется более правильный вариант,
while в конце цикла:
do {...} while (условие).
Проблема с одним
while на все случаи будет в том, что, глядя на него, невозможно будет понять - это начало, середина или конец цикла. Возможно, если
while используется в середине/конце цикла, имеет смысл использовать слегка измененное ключевое слово. Что нибудь типа
dowhile. Вариант неудачный, просто ничего лучше не пришло в голову. Здесь большой простор для фантазии.