Next: Функции и переменные для выражений, Previous: Неравенства, Up: Выражения [Contents][Index]
Возможно определять новые операторы с заданным приоритетом, удалять определения существующих операторов или переопределять приоритет существующих операторов. Оператор может быть унарным префиксным или унарным постфиксным, бинарным инфиксным, n-арным (n-ary) инфиксным, матчфиксным (matchfix) или безфиксным (nofix). Матчфиксный (matchfix) обозначает пару символов, которые заключают между собой свой аргумент или аргументы, а безфиксный (nofix) означает оператор, который не принимает аргументы. Следующие примеры демонстрируют различные типы операторов.
изменение знака - a
факториал a!
экспонента a^b
сложение a + b
список [a, b]
(Встроенных безфиксных операторов нет;
для примера такого оператора см. nofix.)
Механизм определения нового оператора прост. Необходимо только объявить функцию как оператор; сама функция оператора может быть определена или нет.
Вот пример определенных пользователем операторов.
Заметим, что явный вызов функции "dd" (a) эквивалентен 
dd a, также как "<-" (a, b) эквивалентно a <- b.
Заметим также, что функции "dd" и "<-" не определены в этом 
примере.
(%i1) prefix ("dd");
(%o1)                          dd
(%i2) dd a;
(%o2)                         dd a
(%i3) "dd" (a);
(%o3)                         dd a
(%i4) infix ("<-");
(%o4)                          <-
(%i5) a <- dd b;
(%o5)                      a <- dd b
(%i6) "<-" (a, "dd" (b));
(%o6)                      a <- dd b
Maxima функции, которые определяют новые операторы, сведены в нижеследующей таблице, с установленными по умолчанию левыми и правыми степенями связывания (lbp и rbp, соответственно). (Степень связывания определяет приоритет операторов. Однако, так как левые и правые степени связывания могут отличаться, степень связывания - это что-то более сложное чем приоритет.) Некоторые функции определения операций принимают дополнительные аргументы, см. описания этих функций для более полного описания деталей.
prefixrbp=180
postfixlbp=180
infixlbp=180, rbp=180
narylbp=180, rbp=180
matchfix(степень связывания не применима)
nofix(степень связывания не применима)
Для сравнения, приведем некоторые встроенные операторы, и их левые и правые степени связывания.
Operator lbp rbp : 180 20 :: 180 20 := 180 20 ::= 180 20 ! 160 !! 160 ^ 140 139 . 130 129 * 120 / 120 120 + 100 100 - 100 134 = 80 80 # 80 80 > 80 80 >= 80 80 < 80 80 <= 80 80 not 70 and 65 or 60 , 10 $ -1 ; -1
remove и kill удаляют свойства оператора из атома.
remove ("a", op) удаляет только свойства оператора a.
kill ("a") удаляет все свойства a, включая свойства
оператора.
Заметим, что имя оператора должно быть взято в кавычки.
(%i1) infix ("@");
(%o1)                           @
(%i2) "@" (a, b) := a^b;
                                     b
(%o2)                      a @ b := a
(%i3) 5 @ 3;
(%o3)                          125
(%i4) remove ("@", op);
(%o4)                         done
(%i5) 5 @ 3;
Incorrect syntax: @ is not an infix operator
5 @
 ^
(%i5) "@" (5, 3);
(%o5)                          125
(%i6) infix ("@");
(%o6)                           @
(%i7) 5 @ 3;
(%o7)                          125
(%i8) kill ("@");
(%o8)                         done
(%i9) 5 @ 3;
Incorrect syntax: @ is not an infix operator
5 @
 ^
(%i9) "@" (5, 3);
(%o9)                        @(5, 3)
Next: Функции и переменные для выражений, Previous: Неравенства, Up: Выражения [Contents][Index]