OberonCore
https://forum.oberoncore.ru/

Оператор Continue
https://forum.oberoncore.ru/viewtopic.php?f=27&t=6735
Страница 1 из 2

Автор:  Peter Almazov [ Суббота, 06 Март, 2021 07:33 ]
Заголовок сообщения:  Оператор Continue

К Оберонам не относится. Но, если есть мысли, почему бы их не зафиксировать.

Я никогда не использовал оператор continue. Считаю, что он годится только для умственно отсталых, которым «внезапно» требуется провалиться в конец цикла. Но тут пришлось работать с унаследованным кодом и признать, что continue имеет право на существование. Он может пригодиться для реализации обхода коллекции с фильтрацией элементов.
В идеале надо бы написать что-то типа такого (псевдокод + LINQ)
Код:
ForEach elem in collection.Where(e => IsCorrect(e)) Do
  …
Когда приходится воплощать это вручную и использовать «if» на весь цикл, добавляется лишний уровень вложенности. Это не здорово, особенно, когда тело цикла приличное (не три строки). Здесь и сгодится нелюбимый continue:
Код:
ForEach elem in collection Do
   If not IsCorrect(e)) Then
      continue
   EndIf
   ….
Итак, кратко: только в начале цикла, для реализации фильтра.

Автор:  Валерий Лаптев [ Суббота, 06 Март, 2021 11:24 ]
Заголовок сообщения:  Re: Оператор Continue

Я его не использовал вообще НИКОГДА.
Никогда не было нужды.
Dreak еще использовал в начале освоения С++, но вот уже много лет и он мне не нужен.

Автор:  Comdiv [ Суббота, 06 Март, 2021 12:01 ]
Заголовок сообщения:  Re: Оператор Continue

Peter Almazov писал(а):
Код:
ForEach elem in collection Do
   If not IsCorrect(e)) Then
      continue
   EndIf
   ….
Итак, кратко: только в начале цикла, для реализации фильтра.

Не пойму, почему не так?
Код:
ForEach elem in collection Do
   If IsCorrect(e) Then
      …
   EndIf
   
Всегда так делаю и считаю это правильным. Единственный недостаток, которым я всегда пренебрегаю, так это то, что когда условия изначально не было и его нужно добавить, то в отличии от варианта с continue требуется задевать отступами остальные строки, увеличивая изменения в системе контроля версий. Но с точки зрения ясности и ошибкоустойчивости это лучше.

Автор:  Peter Almazov [ Суббота, 06 Март, 2021 13:02 ]
Заголовок сообщения:  Re: Оператор Continue

Comdiv писал(а):
Не пойму, почему не так?
Да Вы сами написали почему. И я об этом же.
Код был чужой, а циклы на десятки строк.

Автор:  Rifat [ Суббота, 06 Март, 2021 14:27 ]
Заголовок сообщения:  Re: Оператор Continue

На самом деле foreach способствует появлению break и continue. Проблема в том, что foreach сложно использовать, как цикл while, который часто бывает нужен. То есть, в while в условие просто можно написать, что пока не прошли все элементы или же не нашли нужный элемент, то итерировать. С циклом foreach же так просто не получится. Если нашли нужный элемент, то нужно или бессмысленно идти до конца или же выпрыгивать с помощью break. Поэтому я считаю, что foreach является "родственником" для break, continue и goto и по возможности его нужно не использовать.

Автор:  Валерий Лаптев [ Суббота, 06 Март, 2021 14:31 ]
Заголовок сообщения:  Re: Оператор Continue

foreach и надо использовать только для полной обработки всех элементов контейнера.
Для поиска он не годится.

Автор:  Rifat [ Суббота, 06 Март, 2021 14:44 ]
Заголовок сообщения:  Re: Оператор Continue

Валерий Лаптев писал(а):
foreach и надо использовать только для полной обработки всех элементов контейнера.
Для поиска он не годится.

Согласен.
Там еще другая проблема, что не очень удобно итерировать элементы контейнера для поиска с while, поэтому некоторые используют foreach, break, continue.

Автор:  Comdiv [ Суббота, 06 Март, 2021 16:20 ]
Заголовок сообщения:  Re: Оператор Continue

Peter Almazov писал(а):
Comdiv писал(а):
Не пойму, почему не так?
Да Вы сами написали почему. И я об этом же.
Код был чужой, а циклы на десятки строк.
Вы писали про уровень вложенности, но с continue он никуда и не девается, а лишь становится менее явными в виде незримого Else.

Автор:  Comdiv [ Суббота, 06 Март, 2021 16:28 ]
Заголовок сообщения:  Re: Оператор Continue

Rifat писал(а):
На самом деле foreach способствует появлению break и continue.
...
другая проблема, что не очень удобно итерировать элементы контейнера для поиска с while, поэтому некоторые используют foreach, break, continue.
Тут, скорее, обратные причина и следствие. foreach был сделан таким, потому что есть break. Иначе, можно было бы снабдить цикл дополнительной конструкцией для структурного поиска. Но зачем, если есть более общий break, которым можно выскакивать из вложенных конструкций?

Автор:  Trurl [ Суббота, 06 Март, 2021 18:40 ]
Заголовок сообщения:  Re: Оператор Continue

Недавно заменял
Код:
for (let e of array) {
на
Код:
for (let e of array) if (cond(e)){

Автор:  adimetrius [ Суббота, 06 Март, 2021 21:16 ]
Заголовок сообщения:  Re: Оператор Continue

Comdiv писал(а):
можно было бы снабдить цикл дополнительной конструкцией для структурного поиска

А любопытно бы пример - приведите, пож.

Автор:  adimetrius [ Суббота, 06 Март, 2021 21:27 ]
Заголовок сообщения:  Re: Оператор Continue

Мне кажется, RETURN из середины функции сродни continue и break. При неуемном использовании затрудняет понимание программы и поправки - логика получается очень хрупкой. По сути, это завуалированный GOTO, и реализован компилятором именно так. Нарушает структурированный принцип - один вход один выход. К сожалению (моему), в КП он есть, и в ББ встречается чаще, чем мне бы хотелось. Вот жду и надеюсь, может, выкинут его - Вирт же вроде выкинул из поздних Оберонов. И в раннем Паскале/72 их не было емнип. И еще даже в турбопаскале для функций писали Func := expr. А в позднем Обероне вроде и синтаксис приятнее стал - какое-то присваивание после END.

Автор:  Peter Almazov [ Воскресенье, 07 Март, 2021 19:13 ]
Заголовок сообщения:  Re: Оператор Continue

Собственно, эта тема - о реализации шаблона "обход коллекции с фильтрацией элементов".
Вот кусок кода отсюда. Раньше, увидев continue, я бы оценил этот кусок, скажем так, весьма скептически. А сейчас могу сказать, что это просто реализация шаблона: фильтрация пустых элементов.
Код:
foreach (var part in parts) {
    if (string.IsNullOrEmpty(part))
        continue;

    if (result.EndsWith("?") || part.StartsWith("?"))
        result = CombineEnsureSingleSeperator(result, part, '?');
    else if (result.EndsWith("#") || part.StartsWith("#"))
        result = CombineEnsureSingleSeperator(result, part, '#');
    else if (inFragment)
        result += part;
    else if (inQuery)
        result = CombineEnsureSingleSeperator(result, part, '&');
    else
        result = CombineEnsureSingleSeperator(result, part, '/');

    if (part.Contains("#")) {
        inQuery = false;
        inFragment = true;
    }
    else if (!inFragment && part.Contains("?")) {
        inQuery = true;
    }
}

Автор:  Trurl [ Воскресенье, 07 Март, 2021 19:35 ]
Заголовок сообщения:  Re: Оператор Continue

Да, каких только шаблонов не напридумывают.

Автор:  Info21 [ Вторник, 09 Март, 2021 16:33 ]
Заголовок сообщения:  Re: Оператор Continue

Trurl писал(а):
Да, каких только шаблонов не напридумывают.
Забавно, что механизм, насколько можно понять, тот же, что и с придумыванием языков программирования.

Автор:  Пётр Кушнир [ Вторник, 09 Март, 2021 19:06 ]
Заголовок сообщения:  Re: Оператор Continue

Эти дятлы столько херни в циклах напридумывали, что другие дятлы решили просто отказаться от циклов, мол, теперь мы будем всё время ползать туда сюда по спискам, каждый раз. Дешевле десять раз пробежать по одному и тому же списку, чем научить двенадцать обезьян писать цикл Дейкстры без хаков и процедуры с одним RETURN. Ну а развитием этой шизофрении стала виртуальная "постоянная" итерация с реальным подковёрным построением цикла с обычными if-ами внутре и т.д. И все друг друга поддерживают и друг другу поддакивают, мол да, так и надо, это же прогресс, это же развитие, и у нас больше нет сложных тупых циклов с break и continue. Вот как здорово мы проблему решили. И функций с выходом из середины нет, теперь у нас всё есть выражение и всегда досчитывается до конца. А ещё у нас нет null и эксепшнов, вместо него мы держим в памяти тысячи пустотелых объектов типа ValueOrNull. Такой вот мир, а главное, его не инопланетяне здесь силой насаждают, это люди всё сами себе придумали, под тёплое мягкое групповое одобрение.

Автор:  Info21 [ Вторник, 09 Март, 2021 23:08 ]
Заголовок сообщения:  Re: Оператор Continue

Изрядно сформулировано ))

Автор:  TheAthlete [ Среда, 20 Ноябрь, 2024 12:30 ]
Заголовок сообщения:  Re: Оператор Continue

Думаю, лучше было бы сделать именование как в Perl:
Код:
continue -> next
break    -> last


В целом, в Perl использование next вначале цикла является идиомой:
Код:
while (<>) { # построчно пройтись по файлу, очередную строку ложим в $_
  chomp;
  next if /^\s+#/; # пропускаем строку, в которой встретился комментарий

  # остальной код
}


Но нужно еще попробовать в Обероне привести несколько примеров с использованием или без булевых переменных, для сравнения. Возможно, и не нужно будет добавлять оператор next.

Автор:  Борис Рюмшин [ Среда, 20 Ноябрь, 2024 13:23 ]
Заголовок сообщения:  Re: Оператор Continue

Вот чего точно не нужно добавлять в Оберон.

Автор:  arisu [ Среда, 20 Ноябрь, 2024 15:34 ]
Заголовок сообщения:  Re: Оператор Continue

вообще-то намного лучше добавить Parnas' generalised iterators. но я вот красивого синтаксиса для них придумать не могу. ;-)

p.s.: лучшее, что я смог сочинить:
Код:
LOOP
  WHEN cond DO body AGAIN
  WHEN cond DO body EXIT
END LOOP

и, конечно, тот `LOOP`, что есть — аннигилировать.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/