Maxima Manual: Lisp и Maxima

Next: Сборка мусора, Previous: Справка, Up: Справка [Contents][Index]

### 3.1 Lisp и Maxima

Maxima написана на Lisp, поэтому легко получить доступ к Lisp функциям и переменным из Maxima и наоборот. Lisp и Maxima символы различают с помощью соглашения об именах. Lisp символ, который начинается со знака `$` соответствует Maxima символу без знака доллара. Maxima символ, который начинается со знака `?` соответствует Lisp символу без знака вопроса. Например, Maxima символ `foo` соответствует Lisp символу `$foo`, в то время как Maxima символ `?foo` соответствует Lisp символу `foo`, Заметим, что `?foo` записано без пробелов между `?` и `foo`; иначе можно перепутать с `describe ("foo")`.

`-`, `*`, и другие специальные знаки в Lisp символах должны быть экранированы `\` везде, где они появляются в коде Maxima. Например, Lisp идентификатор `*foo-bar*` записывается как `?\*foo\-bar\*` в Maxima.

Lisp код может быть выполнен из Maxima сессии. Простая строка с Lisp кодом (содержащая одну и более форм) может быть выполнена с помощью специальной команды `:lisp`. Например,

    (%i1) :lisp (foo $x $y)

вызывает Lisp функцию `foo` с Maxima переменными `x` и `y` в качестве аргументов. `:lisp` конструкция может появляться в интерактивном приглашении или в файле, исполняемом командой `batch` или `demo`, но только не в файле исполняемом командами `load`, `batchload`, `translate_file`, или `compile_file`.

Функция `to_lisp()` открывает интегративную Lisp сессию. Ввод `(to-maxima)` закрывает Lisp сессию и возвращает к Maxima.

Lisp функции и переменные, которые, как известно, видны в Maxima как функции и переменные с обычными именами (без специальной пунктуации) должны иметь Lisp имена, начинающиеся со знака `$`.

Maxima чувствительна к регистру символов, различая буквы в нижнем и верхнем регистрах, в идентификаторах, в то время как Lisp - нет. Существуют некоторые правила, управляющие переводом имен между Lisp и Maxima.

1. Lisp идентификатор не заключенный в вертикальные черты соответствует Maxima идентификатору в нижнем регистре. Является ли Lisp идентификатор в верхнем, нижнем, или смешанном регистре, регистр игнорируется. То есть, Lisp `$foo`, `$FOO`, и `$Foo` - все соответствуют Maxima `foo`.
2. Lisp идентификатор, имеющий все знаки в нижнем или все знаки в верхнем регистре и заключенный в вертикальные черты, соответствует Maxima идентификатору с именем в обратном регистре. То есть, верхний регистр меняется в нижний и нижний регистр - в верхний. Например, Lisp `|$FOO|` и `|$foo|` соответствуют Maxima `foo` и `FOO`, в указанном порядке.
3. Lisp идентификатор, который записан в смешанном регистре и заключенный в вертикальные черты соответствует Maxima идентификатору в том же регистре. Например, Lisp `|$Foo|` соответствует Maxima `Foo`.

`#$` Lisp макрооператор позволяет использовать Maxima выражения в Lisp коде. `#$expr$` превращается в Lisp выражение, эквивалентное Maxima выражению expr.

    (msetq $foo #$[x, y]$)

Это имеет тот же самый эффект как при вводе:

    (%i1) foo: [x, y];

Lisp функция `displa` печатает выражение в Maxima форме.

    (%i1) :lisp #$[x, y, z]$
    ((MLIST SIMP) $X $Y $Z)
    (%i1) :lisp (displa '((MLIST SIMP) $X $Y $Z))
    [x, y, z]
    NIL

Функции, заданные в Maxima не являются обычными Lisp функциями. Lisp функция `mfuncall` вызывает Maxima функцию. Например:

    (%i1) foo(x,y) := x*y$
    (%i2) :lisp (mfuncall '$foo 'a 'b)
    ((MTIMES SIMP) A B)

Некоторые Lisp функции скрыты в Maxima пакете, а именно такие как:

`complement`, `continue`, `//`, `float`, `functionp`, `array`, `exp`, `listen`, `signum`, `atan`, `asin`, `acos`, `asinh`, `acosh`, `atanh`, `tanh`, `cosh`, `sinh`, `tan`, `break` и `gcd`.

Категории:Программирование ·

Next: Сборка мусора, Previous: Справка, Up: Справка [Contents][Index]