Nächste: , Vorige: , Nach oben: Programmierung   [Inhalt][Index]

27.1 Lisp und Maxima

Lisp- und Maxima-Bezeichner

Maxima ist in Lisp programmiert. Es ist einfach, Lisp-Funktionen und Lisp-Variable in Maxima zu verwenden. Umgekehrt können Maxima-Funktionen und Maxima-Variablen in Lisp verwendet werden. Ein Lisp-Symbol, das mit einem Dollarzeichen $ beginnt, entspricht einem Maxima-Symbol ohne einem Dollarzeichen. Umgekehrt entspricht einem Maxima-Symbol, das mit einem Fragezeichen ? beginnt, ein Lisp-Symbol ohne das Fragezeichen. Zum Beispiel entspricht dem Maxima-Symbol foo das Lisp-Symbol $foo und dem Maxima-Symbol ?foo entspricht das Lisp-Symbol foo.

Speziellen Zeichen wie einem Trennstrich - oder einem Stern * in Lisp-Symbolen muss ein Backslash \ vorangestellt werden, um diese in Maxima zu verwenden. Zum Beispiel entspricht dem Lisp-Symbol *foo-bar* das Maxima-Symbol ?\*foo\-bar\*.

Im Gegensatz zu Lisp unterscheidet Maxima Groß- und Kleinschreibung. Es gibt einige Regeln, die eine Übersetzung von Namen zwischen Lisp und Maxima betreffen:

  1. Ein Lisp-Bezeichner, der nicht von senkrechten Strichen eingeschlossen ist, entspricht einem klein geschriebenen Maxima-Bezeichner. Die Schreibweise des Lisp-Bezeichners wird dabei ignoriert. Zum Beispiel entspricht den folgenden Lisp-Bezeichnern $foo, $FOO und $Foo jeweils der Maxima-Bezeichner foo.
  2. Ein Lisp-Bezeichner, der vollständig groß oder klein geschrieben ist und von senkrechten Strichen eingeschlossen wird, entspricht einem Maxima-Bezeichner in der umgekehrten Schreibweise. Ein klein geschriebener Lisp-Bezeichner wird also zu einem großgeschriebenen Maxima-Bezeichner und umgekehrt. Zum Beispiel entsprechen den Lisp-Bezeichnern |$FOO| und |$foo| die Maxima-Bezeichner foo und FOO.
  3. Ein Lisp-Bezeichner in gemischter Schreibweise, der von senkrechten Strichen eingeschlossen ist, entspricht einem Maxima-Bezeichner in der gleichen Schreibweise. Zum Beispiel entspricht dem Lisp-Bezeichner |$Foo| der Maxima-Bezeichner Foo.

Für die Syntax von Maxima-Bezeichnern siehe auch Bezeichner.

Ausführung von Lisp-Code in Maxima

Lisp-Code kann mit dem Unterbrechungskommando :lisp von einer Maxima-Kommandozeile ausgeführt werden. Siehe Debugger-Kommandos für weitere Unterbrechungskommandos und deren Beschreibung.

Beispiele:

Addiere die Werte der Maxima-Variablen x und y mit dem Lisp-Operator +.

(%i1) x:10$ y:5$
(%i3) :lisp (+ $x $y)
15

Addiere die Symbole a und b mit der Lisp-Funktion ADD. Das Ergebnis wird der Variablen $RES zugewiesen. Die Variable hat in Maxima den Namen res.

(%i3) :lisp (setq $res (add '$a '$b))
((MPLUS SIMP) $A $B)
(%i3) res;
(%o3)                         b + a

Das :lisp-Kommando ist nützlich, um zum Beispiel Lisp-Eigenschaften von Maxima-Symbolen anzuzeigen, globale Lisp-Variablen wie *PRINT-CIRCLE* zu setzen oder wie im letzten Beispiel die interne Form von Maxima-Ausdrücken anzuzeigen.

(%i4) :lisp (symbol-plist 'mabs)
(TEXSYM ((\left| ) \right| ) TEX TEX-MATCHFIX REAL-VALUED T
        MAPS-INTEGERS-TO-INTEGERS T DIMENSION DIM-MABS TRANSLATE
        #<FUNCTION (LAMBDA #) {972D045}> FLOATPROG MABSBIGFLOAT INTEGRAL
        ((X) #<FUNCTION ABS-INTEGRAL>) OPERATORS SIMPABS DISTRIBUTE_OVER
        (MLIST $MATRIX MEQUAL) NOUN $ABS REVERSEALIAS $ABS GRAD
        ((X) ((MTIMES) X ((MEXPT) ((MABS) X) -1))))

(%i4) :lisp (setq *print-circle* nil)
NIL

(%i4) 'integrate(t*sin(t), t);
                          /
                          [
(%o4)                     I t sin(t) dt
                          ]
                          /
(%i5) :lisp $%
((%INTEGRATE SIMP) ((MTIMES SIMP) $T ((%SIN SIMP) $T)) $T)

Das Kommando :lisp kann in einer Kommandozeile und in Dateien verwendet werden, die mit den Funktionen batch oder demo geladen werden. Dagegen kann das Kommando :lisp nicht in Dateien verwendet werden, die mit den Funktionen load, batchload, translate_file oder compile_file geladen werden.

Ausführung von Maxima-Code in Lisp

Das Lisp-Makro #$ erlaubt die Nutzung von Maxima-Ausdrücken in Lisp-Code. #$expr$ wird zu einem Lisp-Ausdruck expandiert, der dem Maxima-Ausdruck expr entspricht.

Beispiele:

Die beiden folgenden Beispiele zeigen die Zuweisung an eine Variable var. Im ersten Beispiel werden Lisp- und Maxima-Code gemischt. Für die Zuweisung an die Variable wird die Lisp-Funktion MSETQ aufgerufen. Das Makro #$ transformiert den Maxima Ausdruck sin(x) + a^2 in die Lisp-Form ((MPLUS SIMP) ((MEXPT SIMP) $A 2) ((%SIN SIMP) $X)). Dies entspricht dem im zweiten Beispiel gezeigten Maxima-Kommando.

(%i1) :lisp (msetq $var #$sin(x)+a^2$)
((MPLUS SIMP) ((MEXPT SIMP) $A 2) ((%SIN SIMP) $X))

(%i1) var: sin(x)+a^2;
                                     2
(%o1)                      sin(x) + a

In diesem Beispiel wird zunächst ein Maxima-Ausdruck der Variablen $VAR zugewiesen und dann mit der Lisp-Funktion DISPLA ausgegeben.

(%i1) :lisp (setq $var #$'integrate(f(x), x)$)
((%INTEGRATE SIMP) (($F SIMP) $X) $X)
(%i1) :lisp (displa $var)
/
[
I f(x) dx
]
/
NIL

Maxima-Funktionen sind keine Lisp-Funktionen. Um eine Maxima-Funktion in Lisp-Code aufzurufen, kann die Lisp-Funktion MFUNCALL aufgerufen werden.

(%i1) f(x,y) := x^2 + sin(y)$
(%i2) :lisp (mfuncall '$f '$a 10)
((MPLUS SIMP) ((%SIN SIMP) 10) ((MEXPT SIMP) $A 2))

Öffnen einer Lisp-Sitzung

Mit dem Kommando to_lisp() kann von einer Maxima-Kommandozeile eine Lisp-Sitzung geöffnet werden. Mit dem Kommando (TO-MAXIMA) wird die Lisp-Sitzung beendet und nach Maxima zurückgekehrt. Siehe auch to_lisp für ein Beispiel.

Die folgenden Lisp-Funktionen können in Maxima nicht verwendet werden:

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


Nächste: , Vorige: , Nach oben: Programmierung   [Inhalt][Index]