Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Базарная площадь
  
О разделе

Основная страница

Группы обсуждений


Тематический каталог обсуждений

Архив

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  02:59[Войти] | [Зарегистрироваться]
Обсуждение темы:
Оберон-технология: особенности и перспективы


Тематика обсуждения: Оберон-технология. Особенности, перспективы, практическое применение. 

Количество сообщений на странице

Порядок сортировки сообщений
Новое сообщение вверху списка (сетевая хронология)
Первое сообщение вверху списка (обычная хронология)

Перейти на конкретную страницу по номеру


Всего в теме 6256 сообщений

Добавить свое сообщение

Отслеживать это обсуждение

Обсуждение из раздела
Школа ОБЕРОНА

<<<... | 5706—5697 | 5696—5687 | 5686—5677 | ...>>>
Всего сообщений в теме: 6256; страниц: 626; текущая страница: 57


№ 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) {
  result = prs_def().parse(result.str, params);
  result = prs_lexical().parse(result.str, lexers::keyword_t());
}

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)
{
  result = prs_def().parse(result.str, params);

  result = prs_lexical().parse(result.str, lexers::keyword_t());
}


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. Но этот аргумент напоминает мне одну теорию в квантовой механике. Есть очень красивая интерпретация Фейнмана, которая теоретически позвляет решить любую задачу в рамках этой теории. Вот только применение этого формализма даёт такие зубодробительные формулы, что никакую задачу, кроме простейшего гармонического осциллятора, невозможно довести до ответа разумными усилиями. И что толку в такой теории? Каждое поколение физиков знакомится с этой теорией, убеждается в её красивости и идёт решать практические задачи менее фундаментальными, но более приспособленными к жизни методами.

Нельзя любую идею доводить до абсурда, и идею верификации кода тоже.


<<<... | 5706—5697 | 5696—5687 | 5686—5677 | ...>>>
Всего сообщений в теме: 6256; страниц: 626; текущая страница: 57


Добавить свое сообщение

Отслеживать это обсуждение

Дополнительная навигация:
Количество сообщений на странице

Порядок сортировки сообщений
Новое сообщение вверху списка (сетевая хронология)
Первое сообщение вверху списка (обычная хронология)

Перейти на конкретную страницу по номеру
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования