6. УСЛОВНОЕ ВЫПОЛНЕНИЕ

В результате введения операций [<] и [>] оказалось возможным упразднить все так называемые условные операторы, оставив только блок из двух команд, реализующий ветвление вариантов и дополненный двойной проверкой условия. А именно, конструкцию

.

 #case N . . . #end 

где N есть аргумент команды #case. N -- это число, переменная или элемент массива, а многоточием обозначены все другие команды данного варианта, которые выполняются лишь в том случае, если выполняется условие [N=&]. Команда #end ограничивает код одного варианта и проводит дополнительный анализ, а [&] - опять специальная переменная, которая играет важную роль в интерактивных окнах. Самой простой логической операцией, которую можно реализовать с помощью этой команды является ветвление. Допустим у нас есть несколько вариантов кода, из которых надо выполнить какой то один. Это делается набором команд

 # &=2;
 #case 1 . . . #end |   
 #case 2 . . . #end |   
 #case 3 . . . #end |   
 и так далее.

В написанном коде будет выполнен второй вариант. Достаточно поменять значение переменной [&], не трогая остальной код, и будет выполнен новый вариант. Но пара команд #case N ... #end является также и универсальным описанием цикла, то есть многократного повторения некоторой последовательности команд. Дело в том, что условие [N=&] проверяется не только при выполнении открывающей команды #case но и при выполнении закрывающей команды #end. Если это условие снова выполняется, то все команды варианта (то есть то, что в многоточии) выполняются снова и так до бесконечности. При этом значение N (аргумент команды #case) уже изменить нельзя, аргументы считываются только один раз, но вот значение переменной [&] изменить можно и нужно. Чтобы облегчить запись такого изменения, конструкция #end | (с вертикальной чертой через пробел) сначала выполняет операцию [&=12345;], а затем проверяет условие. Есть еще вариант #end (a) когда выполняется операция [&=a;] перед проверкой условия. Но этим вариантом я практически не пользуюсь. Хотя иногда он проще, чем определять переменную [&] повторно. Надо просто привыкнуть. У этой пары команд есть все таки и различие. Дело в том, что команда #case проверяет условие [N=&] на точных вещественных числах, а команда #end -- только на целых, то есть сравниваются лишь целые части обоих чисел. Вообще говоря, разумно все условия проверять на целых числах, так как в вещественных числах могут возникать ошибки округления. Но тем не менее, про эту особенность надо знать. Рассмотрим пример,

 # i=0; &=i; #case 0 . . . . # i=i+1; &=(5-i)<0; #end

Здесь многоточие выполнится для i=0,1,2,3,4,5 и затем цикл закончится и программа пройдет дальше. В такой конструкции #case работает как простой цикл. Но для удобства для этих целей есть и простая команда

 #rep N . . . #end

которая просто N раз повторяет многоточие. Команда #case реально позволяет выполнить или не выполнить что-то в зависимости от любого логического условия. Нужно только правильно определить переменную [&] используя операции [<] и [>] . То есть она одна заменяет и оператор if( ){ } и оператор while( ){ } и оператор switch( ){ } языка Java, а также аналогичные операторы других языков. И в то же время никаких ограничений на возможности программирования не накладывает.
Например, код на Java

 if( a == 1 ){ что-то сделать }

может быть записан в ACL как

 # &=a; #case 1 что-то сделать #end |

Более сложный код

 if( a <= 1 && b >= 2 ){ что-то сделать }

может быть записан в ACL как

 # &=(a-1)>0+(2-b)>0; #case 0 что-то  сделать #end |

Другое условие

 (a <= 1 || b >= 2 )

эквивалентно

 # &=(a-1)>0*(2-b)>0; #case 0 ...

В принципе все условия оператора if( ){ } могут быть записаны как равенство нулю некоторого выражения. Команда #end | изменит [&] на значение 12345 и поэтому тело цикла будет выполнено только один раз. Чтобы получить форму while( ){ } нужно использовать чистую команду #end и вычислять переменную [&] еще раз внутри цикла. Форма switch( ){ } наиболее простая: определяете переменную [&] один раз и используете много команд #case ... #end | с разными значениями аргумента [cod], как было показано выше.

Так как в этих командах аргумент имеет особое значение и считывается сразу, то присваивать значения параметрам в данных командах нельзя. Поле определения параметров нельзя писать сразу за именем команды и нельзя после аргумента. Это в общем-то очевидное ограничение все же надо помнить, так как ошибка не фиксируется.