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, соответственно). (Степень связывания определяет приоритет операторов. Однако, так как левые и правые степени связывания могут отличаться, степень связывания - это что-то более сложное чем приоритет.) Некоторые функции определения операций принимают дополнительные аргументы, см. описания этих функций для более полного описания деталей.
prefix
rbp=180
postfix
lbp=180
infix
lbp=180, rbp=180
nary
lbp=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]