Какие языки имеют структуру управления типами 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()
он выполняется, когда цикл завершается из-за исчерпания списка (с помощью 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: ...
Я чувствую, что это достаточно простая структура, которая заслуживает немного больше сахара. Но, видимо, не было успешных языковых дизайнеров, которые бы полагались на эту структуру так сильно, как я. Интересно, сколько я должен прочитать в это!