Язык программирования Euphoria | страница 31
Выражения, входящие в пункты if и elsif, проверяются с использованием укороченной проверки истинности.
2.5.4 команда while (пока)
Команда while (пока) проверяет сопровождающее её выражение на истинность, и пока выражение истинно, циклически выполняет те команды, которые записаны далее в её теле, то есть,
>while x 0 do
>a = a * 2
>x = x - 1
>end while
Когда выражение, проверяемое командами if, elsif или while содержит операторы and или or, то проводятся укороченные вычисления. Например,
if a < 0 and b > 0 then ...
если a < 0 ложно, то Euphoria не будет беспокоиться о второй проверке (не больше ли b чем 0). Будет решено, что общий результат уже и без того соответствует лжи. Аналогично,
if a < 0 or b > 0 then ...
если a < 0 истинно, то Euphoria немедленно решит, что общий результат соответствует истине и без проверки величины b.
В общем, каждый раз, когда мы ставим условие в форме:
A and B
где A и B могут быть двумя любыми выражениями, Euphoria завершит расчёт, если A ложно, и немедленно станет считать общий результат ложью, даже не взглянув на выражение B.
Аналогично, в случае:
A or B
когда A истинно, Euphoria пропустит вычисление выражения B и учтёт результат как истину.
Если выражение B содержит вызов функции, то из-за возможности наличия у функции побочных эффектов, т.е. и других действий, кроме простой выдачи величины, вы получите предупреждение во время компиляции. Более старые версии Euphoria (до 2.1) не имели укороченной проверки, поэтому возможно, что некоторый старый код будет работать неправильно, хотя поиск в архивах Euphoria и не выявил какие-либо программы, зависящие от побочных эффектов в этом смысле.
Выражение, B в данном случае, может содержать какие-либо дефекты кода, которые во время исполнения программы могли бы спровоцировать её аварийную остановку. Но если Euphoria пропускает вычисление B, ошибка не будет обнаружена, например,
>if x != 0 and 1/x 10 then -- деление на нуль пропущено
while 1 or {1,2,3,4,5} do -- пропущен незаконный результат с рядом
Выражение B могло бы даже содержать неинициализированную переменную, индекс вне границ и другие недопустимые вещи.
Всё это может вызывать недоумение, так как выглядит подобно неряшливому программированию, но фактически часто позволяет вам написать многие вещи более простым и более ясным образом. Например:
if atom(x) or length(x)=1 then
Без укороченной проверки у вас была бы проблема, когда x является атомом, так как длина для атомов не определена. Но с укороченной проверкой length(x) будет проверяться, только когда x является рядом. Аналогично: