Maxima Manual: Синтаксис

Next: Функции и переменные для выражений, Previous: Неравенства, Up: Выражения [Contents][Index]

### 6.7 Синтаксис

Возможно определять новые операторы с заданным приоритетом, удалять определения существующих операторов или переопределять приоритет существующих операторов. Оператор может быть унарным префиксным или унарным постфиксным, бинарным инфиксным, n-арным (n-ary) инфиксным, матчфиксным (matchfix) или безфиксным (nofix). Матчфиксный (matchfix) обозначает пару символов, которые заключают между собой свой аргумент или аргументы, а безфиксный (nofix) означает оператор, который не принимает аргументы. Следующие примеры демонстрируют различные типы операторов.

унарный префиксный

  изменение знака `- a`

унарный постфиксный

  факториал `a!`

бинарный инфиксный

  экспонента `a^b`

n-арный инфиксный

  сложение `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]