Илья Ермаков писал(а):
Если Вы разрешите произвольные переходы, то начинается веселуха. Постройте такую конструкцию, где Вы имеете второй вход в середину цикла. И поразмыслите над ней на досуге. Увидите, что в ней окажется пара действий, которые при одном маршруте будут идти в одном порядке, при другом - в другом. Т.е. бред, при котором вообще теряется какая-то возможность анализировать "состояния между".
Ага, хх уу zz. Извиняюсь за слово, непроизвольно вырвалось...
Говоря о циклах я имел в виду самый общий случай, безотносительно навешиваемого
или подразумеваемого контекста, то есть: WHILE any_func() DO any_action() END;
Где any_func() и any_action() - произвольные функции, которые в общем случае имеют
свой контекст, но он может быть закрыт или неизвестен. Это могут быть системные вызовы,
какие-то библиотечные функции...
Строить какие-то предположения относительно них в общем случае - нельзя. Поэтому все
рассуждения о доказательности или сходимости или конечности - неправомерны в общем случае.
Конечно можно придумать учебный пример, и "доказать" что он в конечном итоге сойдётся
или не сойдётся к ожидаемому результату за ограниченное количество проходов.
Поведение функций может усложняться внешними воздействиями, быть недетерминированным,
ожидаемого (предполагаемого) результата - может не быть, количество повторов - может быть
неограниченным (неизвестным).
По поводу входа в центр цикла? Да, может привести к ошибке. И что?
Практически любой оператор может привести к ошибке и "веселухе".
GOTO start;
WHILE any_func() DO start: any_action(); END;
// если any_action делает контекст для any_func, то так пожалуй лучше, чем
any_action(); //Если код строк 50 и не вынесен в процедуру, то дублирование.
WHILE any_func() DO any_action(); END;
Насчёт разрешить? - компилятор может распознавать такие случаи и предупреждать.
В обшем случае можно запретить вход внутрь FOR, IF, CASE, и разрешать выходы
из вложенных контрукций (можно тоже с некоторыми оганичениями - например только вперёд
за завершающий вложенные конструкции END или на помеченный RETURN).
Насчёт статьи - посмотрел. Одна мысль есть, слышал раньше.