в нашем обсуждении.
На форуме Oberoncore обсуждается вопрос "
Следует ли сделать переменную цикла FOR еще более локальной (ограничить локальность телом цикла)". Тогда будет больше похоже на FOR в Аде, что по смыслу цикла FOR - хорошо.
Технически это сделать можно, ведь создается же там временная скрытая переменная для граничного значения, почему бы не создать и видимую? Но, понятно, что реализация будет сложнее - надо вводить отдельную область видимости именно для тела цикла. Независимо от технической возможности, возникает вопрос "а верно ли это
по духу Оберона"? Однако "дух"- понятие не формализуемое, поэтому каждый понимает (и имеет право понимать!) это по-своему.
Конечно, счетчик цикла по смыслу является связанной переменной внутри тела цикла, поэтому самая правильная область его локализации - тело цикла. Это довод ЗА.
Против - слишком большие отступления от привычных областей видимости. Со скрытой переменной таких проблем нет именно потому, что она скрытая! А тут получается, что кроме кроме блока процедур есть отдельные области еще и внутри тела процедуры (тело цикла FOR).
То, что я ранее предлагал в реализации "правильного FOR", касалось семантики и механизма реализации, от синтаксиса и "основных принципов" отступлений не было (принципы "не менять переменную и не использовать ее значение после цикла" - нормальные "структурные" принципы, аналогичные паскалевским). Требование для счетчика быть локальным в пределах процедуры не затрагивает
сами области видимости.
А вот появление счетчика в заголовке FOR и пропадание его после цикла кажутся мне уж слишком большим "переломом традиций".
Может быть, конечно, на мое мнение подсознательно влияет и лень в поиске механизма реализации "локальнофоровой" переменной
, но я думаю, лучше ограничиться локальностью на уровне процедуры, как это сейчас сделано. Это некий компромисс между самой широкой локальностью (отсутствие требований локальности вообще) и "самой правильной по смыслу цикла FOR локальностью" (локальность ограничена телом цикла).
Цикл FOR в Аде имеет свои плюсы, но с точки зрения "величины изменений основных принципов" минусы перевешивают. Аде - адово, Оберону - обероново.
Кстати, в Паскале-подобном языке
Modula-2 Revision 2010 цикл FOR по своим свойствам
похож на аналогичный оператор в Аде:
1) Заголовок цикла является описанием переменной цикла, она существует пока цикл выполняется, но исчезает по окончании цикла.
2) Переменную цикла нельзя менять в теле цикла, она меняется автоматически - так, как задано в заголовке.
По синтаксису в простейшем варианте тоже выглядит похоже на Аду
Код:
FOR n IN [1..10] OF INTEGER DO
...
END
но
полный синтаксис FOR в Модуле-2 (rev.2010) сложнее (и, на мой взгляд, излишне наворочен и усложнен).