Какие языки имеют структуру управления типами while-else и как она работает?

Давным-давно я думал, что видел предложение добавить else пункт к for или же while циклы в C или C++... или что-то в этом роде. Я не помню, как это должно было работать - сделал else предложение выполнить, если цикл завершился нормально, но не с помощью оператора break?

В любом случае, это сложно найти, поэтому я подумал, что, возможно, я смогу получить здесь несколько ответов CW для разных языков.

Какие языки поддерживают добавление else пункт к чему-то другому, чем if заявление? В чем смысл этого пункта? Один язык за ответ, пожалуйста.

3 ответа

Питон

Пример использования:

for element in container:
  if element == target:
    break
else:
  # this will not be executed if the loop is quit with break.
  raise ElementNotFoundError()

Из документов Python:

он выполняется, когда цикл завершается из-за исчерпания списка (с помощью for) или когда условие становится ложным (с помощью while), но не тогда, когда цикл завершается оператором break.

Существует так называемая "петля Дейкстры" (также называемая "охраняемая петля Дейкстры"). Он был определен в "Охраняемом командном языке" (GCL). Вы можете найти некоторую информацию об этом синтаксисе и семантике в вышеупомянутой статье Википедии в разделе 6 Повторение: сделайте.

В настоящее время я на самом деле знаю один язык программирования, который напрямую поддерживает эту управляющую структуру. Это Оберон-07 (PDF, 70 КБ). И он поддерживает "петлю Дейкстры" в форме оператора while. Посмотрите на раздел 9.6. Пока заявления в вышеуказанном PDF.

WHILE m > n DO m := m – n 
ELSIF n > m DO n := n – m 
END

Интересно, что ни Python, ни конструкция Oberon не являются теми, которые я искал. В Си я часто обнаруживаю, что часто хочу получить конструкцию "иначе" или "в другое время", которая выполняется только в том случае, если цикл никогда не выполнялся. Может быть, это конструкция, которую вы ищете?

Так что вместо:

if (condition) {
   do {
       condition = update(something);
   } while (condition);  
} else {
   loop_never_taken(something);
}

Я мог бы написать:

while (condition) {
    condition = update(something);
} otherwhile {
    loop_never_taken(something);
}

Это определенно короче, и мне было бы намного понятнее читать. Он даже легко переводится в (псевдо) сборку:

    while: test condition
           bz elsewhile
     loop: push something    
           call update
     test: test condition
           bnz loop
           jmp done         
elsewhile: push something
           call loop_never_taken
     done: ...

Я чувствую, что это достаточно простая структура, которая заслуживает немного больше сахара. Но, видимо, не было успешных языковых дизайнеров, которые бы полагались на эту структуру так сильно, как я. Интересно, сколько я должен прочитать в это!

Другие вопросы по тегам