Lisp und Maxima (Maxima Manual)

Nächste: Einführung in die Programmierung, Vorige: Programmierung, 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: Einführung in die Programmierung, Vorige: Programmierung, Nach oben: Programmierung [Inhalt][Index]