OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 02:38

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Обобщенный цикл
СообщениеДобавлено: Вторник, 15 Февраль, 2011 22:34 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Маленькое дополнение по поводу синтаксического сахара.
Когда Кнут рассуждает об обобщенном цикле, то он приводит не тот вид, который я привел в начале темы:
Код:
цикл
   последовательность команд Х
   что-нибудь типа exit или break по условию
   последовательность команд Y
конец цикла
а, по сути, такой (опять перевру Кнута для удобства :) )
Код:
цикл
  X;
  пока Условие
  Y;
конец цикла

Я сначала недооценил тот факт, что во втором варианте используется условие продолжения цикла, а не условие выхода из цикла, как в первом. Причина этой недооценки - мышление в терминах реализации через exit/break, да и реализация цикла в Аде сыграла свою отрицательную роль.

Проблема вот в чем. Как уже упоминалось, условие с выходом можно перемещать вверх/вниз, получая граничные случаи: цикл типа while и цикл типа repeat..until. При этом, в верхнем положении нужно использовать условие продолжения цикла, а если смещать условие вниз, то нужно использовать его отрицание - для выхода. Как показывает практика, это очень неудобно. Гораздо удобнее и логичнее двигать именно while вверх/вниз без всяких отрицаний в определенных положениях.
То есть, в "правильном" языке конструкция для обобщенного цикла должна быть именно такого вида:
Код:
цикл
  X;
  пока Условие
  Y;
конец цикла

Из этих соображений, кстати, видна порочность конструкции repeat..until. При моей общей нелюбви к С, должен признать, что там используется более правильный вариант, while в конце цикла:
do {...} while (условие).

Проблема с одним while на все случаи будет в том, что, глядя на него, невозможно будет понять - это начало, середина или конец цикла. Возможно, если while используется в середине/конце цикла, имеет смысл использовать слегка измененное ключевое слово. Что нибудь типа dowhile. Вариант неудачный, просто ничего лучше не пришло в голову. Здесь большой простор для фантазии.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обобщенный цикл
СообщениеДобавлено: Среда, 16 Февраль, 2011 06:47 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
Peter Almazov писал(а):
Маленькое дополнение по поводу синтаксического сахара.
...
То есть, в "правильном" языке конструкция для обобщенного цикла должна быть именно такого вида:
Код:
цикл
  X;
  пока Условие
  Y;
конец цикла

Из этих соображений, кстати, видна порочность конструкции repeat..until. При моей общей нелюбви к С, должен признать, что там используется более правильный вариант, while в конце цикла:
do {...} while (условие).

Проблема с одним while на все случаи будет в том, что, глядя на него, невозможно будет понять - это начало, середина или конец цикла. Возможно, если while используется в середине/конце цикла, имеет смысл использовать слегка измененное ключевое слово. Что нибудь типа dowhile. Вариант неудачный, просто ничего лучше не пришло в голову. Здесь большой простор для фантазии.
В общем, пока Условие выполняется, переходим к блоку Y - а далее начинаем новую итерацию с цикл (трактуется как метка для БП конец цикла)? А когда Условие не выполняется - на первый оператор, следующий за конец цикла? Или какая-то иная логика?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обобщенный цикл
СообщениеДобавлено: Среда, 16 Февраль, 2011 06:55 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Peter Almazov писал(а):
Проблема с одним while на все случаи будет в том, что, глядя на него, невозможно будет понять - это начало, середина или конец цикла. Возможно, если while используется в середине/конце цикла, имеет смысл использовать слегка измененное ключевое слово. Что нибудь типа dowhile. Вариант неудачный, просто ничего лучше не пришло в голову. Здесь большой простор для фантазии.
Хм... а может быть... так:
Код:

mark_start_loop:
<operators_pred_if_group>

if <condition> then GoTo mark_continue;

<operators_post_if_group>

GoTo mark_start_loop;

<operators_post_loop_group>

mark_continue:
...

В случае, если группа операторов <operators_post_if_group> пустая, то условный переход (if <condition> then GoTo mark_continue) и безусловный (GoTo mark_start_loop) сливаются, превращаясь в конструкцию вида:
Код:
if <condition> then
        GoTo mark_continue
else
        GoTo mark_start_loop;


PS
1. Понимаю, что GoTo "режет глаз", но это в данном случае просто демонстрация конструкции, при реальном применении можно найти "замазку" в виде while, repeat, loop / break, exit, continue или других синтаксических конструкций;
2. Группа операторов после цикла <operators_post_loop_group> нужна в случае, если все итерации цикла исчерпаны, а условие так и не было выполнено. Типичный пример: ищем соответствие в списке элементов. Все элементы перебраны, но соответствие не найдено - выполняем данную группу операторов (в ней, например, создаем недостающий-не найденный элемент).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обобщенный цикл
СообщениеДобавлено: Среда, 16 Февраль, 2011 07:09 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
alexus писал(а):
Peter Almazov писал(а):
Проблема с одним while на все случаи будет в том, что, глядя на него, невозможно будет понять - это начало, середина или конец цикла. Возможно, если while используется в середине/конце цикла, имеет смысл использовать слегка измененное ключевое слово. Что нибудь типа dowhile. Вариант неудачный, просто ничего лучше не пришло в голову. Здесь большой простор для фантазии.
Хм... а может быть... так:
Код:

mark_start_loop:
<operators_pred_if_group>

if <condition> then GoTo mark_continue;

<operators_post_if_group>

GoTo mark_start_loop;

<operators_post_loop_group>

mark_continue:
...

Да, и я о том же :wink: см. о LOOP-EXIT в этом пункте.

P.S. Только у Вас более свободная структура - конструкция не ограничена LOOP - кроме блоков тела цикла X (у Вас - pred_if; по смыслу - ДО-подтело) и Y (у Вас - post_if; ПОКА-подтело) охватывается ещё блок post_loop (причём не видно - когда же он будет исполняться - LOOP-то бесконечный)...


Последний раз редактировалось Владислав Жаринов Воскресенье, 20 Февраль, 2011 10:01, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обобщенный цикл
СообщениеДобавлено: Среда, 16 Февраль, 2011 09:32 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Драконограф писал(а):
Да, и я о том же :wink: см. о LOOP-EXIT в этом пункте.
Ничего удивительного... :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB