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]