Next: Einführung in die Programmierung, Previous: Programmierung, Nach oben: Programmierung [Inhalt][Index]
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:
$foo, $FOO und $Foo jeweils der
Maxima-Bezeichner foo.
|$FOO| und |$foo| die
Maxima-Bezeichner foo und FOO.
|$Foo| der
Maxima-Bezeichner Foo.
Für die Syntax von Maxima-Bezeichnern siehe auch Bezeichner.
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.
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))
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.
Next: Einführung in die Programmierung, Previous: Programmierung, Nach oben: Programmierung [Inhalt][Index]