5. ВЫЧИСЛЕНИЯ

Теперь о математических расчетах и функциях. Все расчеты делаются в той части текста программы, которая является аргументом специальной команды #calc или #с. Есть еще вариант этой команды, когда ее можно писать вообще без имени, так как учитывая частое использование этой команды для нее сделано исключение. Она не имеет параметров, а ее аргументом является совокупность операторов присваивания. Например,
# a=1; b=sin(a); c=b<2; i(5000)=&;
Итак два знака [# ] (пробел после решетки обязателен) открывает поле операторов присваивания с конструкцией <name>=<value>; причем пробелы между этими элементами могут быть в любом количестве, в том числе и отсутствовать. Можно все писать совсем без пробелов. Это поле заканчивается либо знаком [#], то есть началом новой команды, либо знаком [@], то есть концом процедуры. Можно ставить комментарии специальной конструкции, но проще оборвать поле командой #% записать комментарий, а потом открыть новую команду. Про команду #% написано выше при описании команды выполнения процедур #e . Для выполнения вычислений есть все стандартные операции
   +  -  *  /  ^  (  )
записанные в обратном порядке очередности выполнения. Знак ^ означает возведение в степень. И есть стандартные функции. Последние имеют имена, состоящие из трех знаков. Список стандартных функций дополнен некоторыми специальными функциями. Он перечислен ниже:

    abs() == абсолютное значение
    sqr() == квадратный корень
    log() == натуральный логарифм
    exp() == экспонента
    sin() == синус
    ars() == арксинус
    cos() == косинус
    arc() == арккосинус
    tan() == тангенс
    art() == арктангенс
    rnd() == случайное значение
    int() == целая часть
    sfi() == синус интеграл Френеля int(0,x)dt*sin((pi/2)*t^2)
    cfi() == косинус интеграл Френеля int(0,x)dt*cos((pi/2)*t^2)
    bj0() == функция Бесселя J[0](x)
    bj1() == функция Бесселя J[1](x)

Аргумент у функций записывается в круглые скобки так же, как и индексы элементов массивов. У функции rnd() аргумент не используется, но для соблюдения грамматики надо писать rnd(0). Функция int() получается отбрасыванием дробной части у числа независимо от знака. При этом положительное число становится меньше, а отрицательное -- больше. Для получения ближайшего целого к положительному числу -- аргументу функции надо добавить 0.5, а к отрицательному -0.5. Числа можно писать в любом формате как с точкой, так и с запятой и в экспоненциальной форме как с [E] так и с [e]. Вот примеры правильной записи чисел:
    1,23 1.23 12,3E-1 0.123E1 123e-2
Но в языке ACL есть особенность, отличающая его от других языков, а именно, добавлены две новые операции a<b и a>b . Они означают меньшее из двух и большее из двух. Обычно это делается функцией двух переменных, но в ACL нет функций двух переменных, а минимум и максимум реализован операцией. Например, a<1 означает [a], если [а] меньше единицы, и 1, если больше. Приоритет этих операций выше всех других, кроме скобок. То есть все сложные части этих операций обязательно должны быть в скобках.

К команде расчетов естественным образом примыкают еще две простые, но полезные команды. Первая из них
#d N r(11) a b c*5 g ...
Имя этой команды (data) но достаточно одной буквы. Она позволяет быстро определить значения элементов массивов. Первый аргумент (N) определяет сколько элементов будет определено, второй указывает первый элемент массива для определения. Эта запись задает как тип массива, так и первый индекс. Важно иметь в виду, что переменные тоже образуют массив, специальным образом упорядоченный, так что их тоже можно определять таким способом. А после идут значения, которые надо присвоить элементам массива. Это могут быть числа, переменные и элементы массивов. Если после значения стоит *5, то это означает, что данное значение нужно взять 5 раз. Итак аргументы команды образуют следующую структуру: <число><начало массива><данные>. Но таких структур может быть сколько угодно, одна структура следует за другой. Окончание опять либо на знаке [#] либо на знаке [@] - все остальное трактуется как ошибка. Число N ограничено и не может быть больше 500.
Вторая команда
#pas N r(11) i(25)
позволяет быстро присвоить значения из элементов одного массива элементам другого массива, как говорят, переслать значения из одного массива в другой. Если массивы имеют разный тип, то параллельно происходит преобразование типа. Первым указывается массив из которого пересылаются значения, вторым - куда пересылаются. Например, в указанном примере вещественные числа будут округлены до ближайшего целого. В этой команде структура не повторяется. Надо снова писать имя команды. Число N не ограничено.