Оберон-технология: особенности и перспективы |
Тематика обсуждения: Оберон-технология. Особенности, перспективы, практическое применение.
Всего в теме 6256 сообщений
Добавить свое сообщение
Отслеживать это обсуждение  Обсуждение из раздела Школа ОБЕРОНА
№ 5696 21-10-2007 09:15 |  |
Ответ на »сообщение 5691« (Илья Ермаков)
___________________________
>>> Однако, как я понял, автор выкинул из кода куски (там стоит //-), т.е. действие реально гораздо объёмнее, поэтому и используется цикл с постусловием.
Нет, код приведен как он есть, просто автор любит использовать (//-) для визуального разделения групп логически связанных последовательностей операторов... ;-)
№ 5695 21-10-2007 09:15 |  |
Ответ на »сообщение 5692« (Стэн)
___________________________
Ответ на »сообщение 5686« (Илья Ермаков)
А чтобы теория о WHILE сошлась с практикой, то, на мой взгляд, необходимо в императивном языке строго запретить side-effect'ы и косвенный вызов функций, а еще передачу параметров условных выражений по ссылкам в функции...
А в обсуждаемых примерах не было ни side-effects, ни передачи параметров по ссылкам.
А по поводу преимуществ - Вы не хотите работать в рамках грамотных алгоритмических схем, потому что без привычки работы с ними Вы не ощущаете того, что большинство циклов с ними становятся похожи один на другой (ведь во всех обсуждавшихся и сегодня, и всё время примеров нет реально сложных циклов, требующих индивидуального подхода, "формальной раскрутки", например, с хитрой математикой и изменениями многих переменных, фигурирующих в условии) - в итоге никакой сложности написания или чтения нет вообще. В Вашем сознании, прошу прощения, замкнутый круг - пока не попробуете, не видите преимуществ, а не видите, потому что не пробовали :-) А не пробовали, в итоге, потому, что в школе не научили :-)
И предлагаете всем заняться изобретательством велосипедов на основе занимательного комбинаторного конструктора FOR-BREAK. И превратить каждый простейший типовой цикл в самобытное "произведение искусства". :-)
№ 5694 21-10-2007 09:13 |  |
Ответ на »сообщение 5689« (Geniepro)
___________________________
return_t result(str);
result = prs_lexical().parse(result.str, lexers::keyword_t());
while (result.lexeme == LEX_DEF)
return result;
Хороший ответ и ничего не попорчено... :-)
Только появилась новая проблема - дублирование кода. Ладно здесь одна строчка, а если их больше...
И второе. При том, что у нас WHILE с формальными предусловиями, ни один компилятор не догадается, что эти две строчки должны совпадать. И даже вынесение в функцию не спасет (когда строчек много), ведь компилятор не догадается, что одна и таже функция должна вызываться... Т.е. необходимость поддерживать формализм циклов, требует от программиста повышение внимательности...
Интересно было бы услышать доводы в пользу того, что несмотря на все это, данный способ лучше чем с RETURN, BREAK внутри цикла.
№ 5693 21-10-2007 09:07 |  |
Ответ на »сообщение 5692« (Стэн)
___________________________
Ответ на »сообщение 5686« (Илья Ермаков)
___________________________
>>> Ну и какое отношение имеет сей код (и не с WHILE, а с многими выходами) к обсуждаемому вопросу?
А какой вопрос мы обсуждаем? Лично я обсуждаю вопрос о том, что WHILE - в реальных реализациях и применении, а не в теоретических построениях, ничем не лучше, а будучи единственным видом циклов, возможно даже хуже, чем специализированные виды циклов (FOR, FOREACH) и конструкций управления потоком команд (BREAK, RETURN, CONTINUE).
Тогда я тем более не понял, к чему Ваш пример. Привели пример огромного, труднопонятного цикла, в котором используется "специализированный вид цикла (LOOP) и конструкция управления потоком команд (EXIT)" :-)
№ 5692 21-10-2007 08:48 |  |
Ответ на »сообщение 5686« (Илья Ермаков)
___________________________
>>> Ну и какое отношение имеет сей код (и не с WHILE, а с многими выходами) к обсуждаемому вопросу?
А какой вопрос мы обсуждаем? Лично я обсуждаю вопрос о том, что WHILE - в реальных реализациях и применении, а не в теоретических построениях, ничем не лучше, а будучи единственным видом циклов, возможно даже хуже, чем специализированные виды циклов (FOR, FOREACH) и конструкций управления потоком команд (BREAK, RETURN, CONTINUE).
А чтобы теория о WHILE сошлась с практикой, то, на мой взгляд, необходимо в императивном языке строго запретить side-effect'ы и косвенный вызов функций, а еще передачу параметров условных выражений по ссылкам в функции...
№ 5691 21-10-2007 08:47 |  |
Ответ на »сообщение 5689« (Geniepro)
___________________________
Ответ на »сообщение 5672« (Стэн)
___________________________
Вообще без return не получится, ведь функция должна вернуть свой результат по return. Но не внутри цикла, а после него:
Вот как раз и пример привели второго пути - дублирование действия до цикла.
Однако, как я понял, автор выкинул из кода куски (там стоит //-), т.е. действие реально гораздо объёмнее, поэтому и используется цикл с постусловием.
№ 5690 21-10-2007 08:45 |  |
Ответ на »сообщение 5687« (Антон Григорьев)
___________________________
Ответ на »сообщение 5680« (Илья Ермаков)
___________________________
1. А разве то, что читающий этот код человек должен проявить наблюдательность и заметить, что в обоих случаях одно и то же условие, не усложняет чтение?
3. Если условие понядобится модифицировать, то типичная ошибка в таком случае - поменять его в одном месте и забыть поменять в другом. Как быть с этим?
Это настолько типовые схемы циклов, что знающий их человек не забудет.
А вот забыть или незаметить, где в каждом "неповторимо сымпровизированном" цикле стоит break и когда он выполняется - проще простого.
По поводу оптимизации кода я уже ответил - выбираем сами. Если условие простое, то дублируем его. Если простое действие, то выносим его за цикл лишний раз - никаких лишних действий (хоть и лишние байты маш. кода).
Есть, конечно, третий случай - огромное условие и огромное действие. Тогда, если упростить цикл реально не удаётся, то либо применяем вложенные процедуры, либо действительно LOOP-EXIT (while(true) break). Но уж точно не гибрид цикла с условием и явным выходом.
№ 5689 21-10-2007 08:41 |  |
Ответ на »сообщение 5672« (Стэн)
___________________________
>>> Это WHILE, но с BREAK (RETURN) внутри. Сможете его переформулировать так, чтобы код стал проще (без доп. логических переменных и еще одного if), но без использования return?
Вообще без return не получится, ведь функция должна вернуть свой результат по return. Но не внутри цикла, а после него: return_t result(str);
result = prs_lexical().parse(result.str, lexers::keyword_t());
while (result.lexeme == LEX_DEF)
return result; Разве так не проще, чем у Вас? По-моему, проще...
ЗЫ. Я тут ничего не запортил? :о)
№ 5688 21-10-2007 08:40 |  |
Ответ на »сообщение 5687« (Антон Григорьев)
___________________________
Ответ на »сообщение 5680« (Илья Ермаков)
___________________________
1. А разве то, что читающий этот код человек должен проявить наблюдательность и заметить, что в обоих случаях одно и то же условие, не усложняет чтение?
А как этот "читающий код человек" будет анализировать код?
Читая объемлющий фрагмент, увидит цикл и захочет понять, когда этот цикл закончится. Если условие описано явно, то это сразу видно, и можно продолжать просмотр дальше. И только если нужно углубиться внутрь цикла - тогда начинается просмотр его тела. Ну и что, что где-то в теле проверяется то же условие, которое является условием продолжения цикла? Сразу видно, что это действие будет выполнено, только если мы не находимся на последней итерации. А если бы это действие не изменяло внешнее по отношению к циклу состояние, то можно было бы и не ставить if, а просто позволить ему выполниться один раз в холостую.
Суть-то цикла в том, что по ходу его выполнения некоторая группа действий должна быть выполнена на один раз больше (меньше), чем другая. В зависимости от того, что удобнее, можно выбрать одну из двух схем - использование WHILE и дублирование "лишнего" действия до него (подготовка инварианта), либо использование REAPEAR UTIL (do while) и обрамление действия, которое выполняется меньшее число раз, в if с дублированием условия цикла. Критерий выбора - что короче: продублировать действие или продублировать условие с лишней конструкцией if.
№ 5687 21-10-2007 07:49 |  |
Ответ на »сообщение 5680« (Илья Ермаков)
___________________________
Я бы оставил свой вариант, но, поскольку один и тот же lexem нужен два раза, ввёл его отдельной переменной.
lexem = result.lexem;
if ( lexem == LEX_DEF )
result = ...;
while ( lexem == LEX_DEF );
И вы действительно считаете этот вариант самым удобным для чтения и для сопровождения? Удивлён безмерно...
Лично мне в этом цикле категорически не нравится, что одно и то же условие (lexem == LEX_DEF) приходится проверять дважды. Сразу возникают три вопроса:
1. А разве то, что читающий этот код человек должен проявить наблюдательность и заметить, что в обоих случаях одно и то же условие, не усложняет чтение?
2. А если вычисление этого выражения требует больших затрат, сумеет ли компилятор соптимизировать этот код, или программа так и будет тупо вычислять дважды одно и то же?
3. Если условие понядобится модифицировать, то типичная ошибка в таком случае - поменять его в одном месте и забыть поменять в другом. Как быть с этим?
Я, конечно, понимаю, что можно условие вычислить один раз, загнать его в булевскую переменную, и последние два вопроса это точно снимет. Но читаемость кода, в котором на каждый чих заводится отдельная переменная, всё же сильно страдает.
Я, конечно, понимаю, что существует хорошая формальная методика доказательства цикла while. Но этот аргумент напоминает мне одну теорию в квантовой механике. Есть очень красивая интерпретация Фейнмана, которая теоретически позвляет решить любую задачу в рамках этой теории. Вот только применение этого формализма даёт такие зубодробительные формулы, что никакую задачу, кроме простейшего гармонического осциллятора, невозможно довести до ответа разумными усилиями. И что толку в такой теории? Каждое поколение физиков знакомится с этой теорией, убеждается в её красивости и идёт решать практические задачи менее фундаментальными, но более приспособленными к жизни методами.
Нельзя любую идею доводить до абсурда, и идею верификации кода тоже.
Добавить свое сообщение
Отслеживать это обсуждение 
Дополнительная навигация: |
|