Выражение, 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 является рядом. Аналогично:
-- найти 'a' или 'A' в s
i = 1
while i <= length(s) and s[i] != 'a' and s[i] != 'A' do
i += 1
end while
В данном цикле переменная i может стать больше length(s). Без укороченной проверки вас поджидала бы ошибка индексирования, когда s[i] вычисляется в самом последнем цикле. Но с укороченной проверкой циклические вычисления будут немедленно прерваны, как только выражение i <= length(s) станет ложным. Euphoria не будет вычислять s[i] != 'a' и не будет вычислять s[i] != 'A'. И вы, тем самым, будете застрахованы от ошибки индексирования.
Укороченная проверка and и or имеет место только в командах if, elsif и while. Она не используется в других контекстах. Например, команда присваивания:
x = 1 or {1,2,3,4,5} -- x будет присвоено значение {1,1,1,1,1}
Если бы укороченная проверка была применена здесь, мы бы получили x равным 1, а интерпретатор даже не взглянул бы на {1,2,3,4,5}. Это было бы неправильным решением. Укороченная проверка может использоваться в командах if/elsif/while, поскольку там нас заботит лишь общий результат в виде да/нет, а этим командам только и нужен именно атом, как результат вычисления выражения для проверяемого условия.
2.5.5 команда for (для, от)
С помощью команды for устанавливается специальный цикл вычислений с управляющей переменной цикла, которая пробегает ряд значений, начиная от первой заданной величины, вверх или вниз до некоторой последней величины, то есть,
for i = 1 to 10 do
? i -- ? - это короткая форма для print()
end for
-- дробные числа также разрешены
for i = 10.0 to 20.5 by 0.3 do
for j = 20 to 10 by -2 do -- счёт вниз
? {i, j}
end for
end for
Переменная цикла объявляется автоматически и существует до конца циклических вычислений, предусмотренных данным циклом. Вне тела команды цикла переменная цикла не имеет величины и даже не может считаться объявленной. Если вам необходима её последняя величина, присвойте её величину некоторой заранее объявленной обычной переменной перед выходом из цикла. Компилятор не позволяет никаких присваиваний переменной цикла. Начальная величина, конечная величина и величина шага все должны быть атомами. Если величина шага не указана, считается, что шаг равен +1. Конечная величина и величина шага устанавливаются при входе в цикл и во время цикла никак не могут быть изменены. См. также о сцене переменной цикла в разделе 2.4.2 Сцена (область видимости).
2.5.6 команда return (выдать, вернуться)
Команда return приводит к немедленному выходу из подпрограммы. Если подпрограмма является функцией или типом, в команде должна быть предусмотрена выдаваемая такой подпрограммой величина. То есть,
return
return {50, "FRED", {}}
2.5.7 команда exit (выйти)
Команда exit может использоваться в цикле whileили в цикле for. Она вызывает немедленное прерывание цикла с передачей управления первой команде, следующей после тела цикла. То есть,
for i = 1 to 100 do
if a[i] = x then
location = i
exit
end if
end for
Очень часто также можно видеть следующий вариант использования этой команды:
constant TRUE = 1
while TRUE do
...
if some_condition then
exit
end if
...
end while
То есть, это "бесконечный" цикл while, который прерывается командой exit в некоторой характерной точке в теле цикла.
Примечания о производительности: В Euphoria этот бесконечный тип цикла оптимизирован. Во время прогона программы никакие повторные проверки истинности выражения в команде while уже не выполняются, а совершается простой безусловный переход от end while обратно к первой команде внутри тела цикла. Если вам случится попасть в настоящий бесконечный цикл с интерпретатором ex.exe, когда не выполняются операции ввода/вывода, знайте, что простого пути остановить этот цикл не существует. Вы должны будете одновременно нажать клавиши Control-Alt-Delete, чтобы перезагрузиться под DOS, или прервать свой сеанс DOS под Windows. Если программа имела файлы, открытые на запись, будет полезно после перезагрузки запустить scandisk, чтобы проверить исправность своей файловой системы. Только если ваша программа ожидает ввода с клавиатуры, комбинация Control-c может прервать её исполнение (если вами не была выдана команда allow_break(0)).
Читать дальше