.
#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], как было показано выше.
Так как в этих командах аргумент имеет особое значение и считывается сразу, то присваивать значения параметрам в данных командах нельзя. Поле определения параметров нельзя писать сразу за именем команды и нельзя после аргумента. Это в общем-то очевидное ограничение все же надо помнить, так как ошибка не фиксируется.