Laufzeitumgebung (Maxima Manual)

## 26 Laufzeitumgebung

### 26.1 Initialisierung von Maxima

Wenn Maxima startet, werden die beiden Dateien `maxima-init.mac` und `maxima-init.lisp` automatisch geladen, sofern diese vorhanden sind. Die Datei `maxima-init.mac` wird mit der Funktion `batchload` von Maxima geladen und kann beliebige Maxima-Ausdrücke enthalten, die beim Starten von Maxima ausgeführt werden. Die Datei `maxima-init.lisp` wird mit der Funktion `load` geladen und kann entsprechende Lisp-Anweisungen enthalten. Beide Dateien erlauben es dem Nutzer, globale Variablen zu setzen, Funktionen zu definieren oder sonstige Aktionen auszuführen, um zum Beispiel die Maxima-Umgebung anzupassen.

Die Dateien `maxima-init.mac` und `maxima-init.lisp` können in jedem Verzeichnis abgelegt werden, das von der Funktion `file_search` gefunden wird. Üblicherweise wird das Verzeichnis gewählt, das in der Optionsvariablen `maxima_userdir` enthalten ist und die von Maxima beim Starten entsprechend dem Betriebssystem mit einem Standardwert initialisiert wird.

Beispiel:

Im Folgenden wird ein Beispiel für den Inhalt einer Datei `maxima-init.mac` gezeigt. In diesem Beispiel werden einige globale Werte auf neue Anfangswerte gesetzt.

    /* maxima-init.mac */
    print(" Lade ", file_search("maxima-init.mac"), " ...")$
    linel:65$      /* 65 Zeichen pro Zeile */
    leftjust:true$ /* Linksbündige Ausgabe */
    algebraic:true$ /* Vereinfache algebraische Zahlen */
    fpprec:25$      /* große Gleitkommazahlen mit 25 Stellen */
    print (" maxima-init.mac ist geladen.")$

Die Optionsvariable `maxima_userdir` enthält ein geeignetes Verzeichnis, um die Datei `maxima-init.mac` abzulegen. Mit der Funktion `file_search` kann geprüft werden, ob die Datei von Maxima gefunden wird.

    (%i1) maxima_userdir;
    (%o1)                 /home/dieter/.maxima
    (%i2) file_search("maxima-init.mac");
    (%o2)         /home/dieter/.maxima/maxima-init.mac

Im Folgenden wird Maxima mit einer Datei `maxima-init.mac` gestartet, die die oben angegebenen Maxima Kommandos enthält.

    dieter@dieter:~/Maxima/maxima$ rmaxima
    Maxima 5.25.1 http://maxima.sourceforge.net
    Mit Lisp SBCL 1.0.53
    Lizensiert unter der GNU Public License. Siehe die Datei COPYING.
    Gewidmet dem Andenken an William Schelter.
    Die Funktion bug_report() gibt Informationen zum Berichten von Fehlern.
     Lade  /home/dieter/.maxima/maxima-init.mac  ...
     maxima-init.mac ist geladen.
    (%i1)

Die Sitzung wird fortgesetzt, die Variablen enthalten die gewünschten neuen Standardwerte und die Anzeige ist linksbündig formatiert.

    (%i1) linel;
    (%o1) 65
    (%i2) algebraic;
    (%o2) true
    (%i3) fpprec;
    (%o3) 25

Hinweis:

Mit dem Kommando `reset` werden die Optionsvariablen nicht auf die Werte der Datei `maxima-init.mac` zurückgesetzt, sondern auf die ursprünglichen in Maxima festgelegten Standardwerte. Wird das Kommando `kill` ausgeführt, gehen weiterhin alle in der Initialisierungsdatei definierten Variablen und Funktionen verloren. In beiden Fällen muss die Datei `maxima-init.mac` erneut zum Beispiel mit der Funktion `load` geladen werden.

Die obige Sitzung wird fortgesetzt. Die Variablen werden mit `reset` zurückgesetzt. Dann wird die Datei `maxima-init.mac` mit der Funktion `load` geladen.

    (%i4) reset();
    (%o1) [features, fpprec, _, __, labels, %, linenum, algebraic,
                                       tr-unique, leftjust, lispdisp]
    (%i2) fpprec;
    (%o2)                          16
    (%i3) load("maxima-init.mac");
     Lade  /home/dieter/.maxima/maxima-init.mac  ...
     maxima-init.mac ist geladen.
    (%o3) /home/dieter/.maxima/maxima-init.mac
    (%i4) fpprec;
    (%o4) 25

Die obigen Ausführungen treffen auf gleiche Weise auf die Datei `maxima-init.lisp` zu, wobei in diesem Fall die Datei Lisp-Anweisungen enthält.

Beispiel:

Das folgende Beispiel zeigt die Übersetzung des obigen Beispiels für die Datei `maxima-init.mac` in Lisp-Anweisungen.

    ;;; maxima-init.lisp
    (format t " Lade ~A ...~%" ($file_search "maxima-init.lisp"))
    (setq $linel 65)
    (setq $leftjust t)
    (setq $algebraic t)
    (setq $fpprec 25)
    (fpprec1 nil $fpprec)
    (format t " maxima-init.lisp ist geladen.~%")

Die Datei `maxima-init.lisp` ist im besonderen dazu geeignet, einen Patch in Maxima einzuspielen, um einen Programmierfehler zu beheben.

### 26.2 Interrupts

Eine Berechnung kann mit dem Kommando `^c` (`control-c`) abgebrochen werden. Standardmäßig kehrt Maxima zu der Eingabeaufforderung der Konsole zurück. In diesem Fall ist es nicht möglich, die Berechnung fortzusetzen.

Beispiel:

Eine lange Rechnung wird mit `^c` abgebrochen. Maxima kehrt zur Eingabeaufforderung zurück.

    (%i1) factor(factorial(10000))$

    Maxima encountered a Lisp error:
     Interactive interrupt at #x9224192.

    Automatically continuing.
    To enable the Lisp debugger set *debugger-hook* to nil.
    (%i2)

Wird die Lisp-Variable `*debugger-hook*` mit dem Kommando `:lisp (setq *debugger-hook* nil)` auf den Wert `nil` gesetzt, dann startet Maxima den Lisp-Debugger, wenn das Kommando `^c` ausgeführt wird. Mit dem Kommando `continue` im Lisp-Debugger kann die unterbrochene Berechnung fortgesetzt werden.

Beispiel:

Die Variable `*debugger-hook*` wird auf den Wert `nil` gesetzt. Der Abbruch der Rechnung startet in diesem Fall den Lisp-Debugger. Die Rechnung kann mit der Auswahl `0` für das Kommando `continue` fortgesetzt werden.

    (%i2) :lisp (setq *debugger-hook* nil)
    NIL
    (%i2) factor(factorial(10000))$

    debugger invoked on a SB-SYS:INTERACTIVE-INTERRUPT
         in thread #<THREAD
         "initial thread" RUNNING
         {C597F49}>:
      Interactive interrupt at #x9224192.

    Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

    restarts (invokable by number or by possibly-abbreviated name):
      0: [CONTINUE    ] Return from SB-UNIX:SIGINT.
      1: [MACSYMA-QUIT] Maxima top-level
      2: [ABORT       ] Exit debugger, returning to top level.

    (SB-BIGNUM:BIGNUM-TRUNCATE #<unavailable argument>
                               #<unavailable argument>)
    0] 0

    (%i3)

Hinweis:

Mit dem Kommando `:lisp (setq *debugger-hook* 'maxima-lisp-debugger)` kann das Standardverhalten von Maxima wiederhergestellt werden.

In Unix-Systemen kann die Ausführung auch mit Kommando `^z` (`control-z`) abgebrochen werden. In diesem Fall wird eine Unix-Shell gestartet. Das Kommando `fg` kehrt zu Maxima zurück.

Wie mit dem Kommando `^c` kann auch ein Lisp-Fehler zu einem Abbruch der Berechnung führen. Maxima meldet den Lisp-Fehler und kehrt standardmäßig zu der Eingabeaufforderung zurück. Wurde die Lisp-Variable `*debugger-hook*` auf den Wert `nil` gesetzt, startet Maxima den Lisp-Debugger.

Beispiel:

Es wird eine Lisp-Funktion `$sqr` definiert, die aus Maxima mit `sqr` aufgerufen werden kann und ihr Argument quadriert. Wird die Funktion mit mehr als einem Argument aufgerufen, wird ein Lisp-Fehler generiert und Maxima kehrt zu der Eingabeaufforderung zurück.

    (%i1) :lisp (defun $sqr (x) (* x x))
    $SQR
    (%i1) sqr(3);
    (%o1)                           9
    (%i2) sqr(2,3);

    Maxima encountered a Lisp error:

     invalid number of arguments: 2

    Automatically continuing.
    To enable the Lisp debugger set *debugger-hook* to nil.

    (%i3)

Jetzt wird die Lisp-Variable `*debugger-hook*` auf den Wert `nil` gesetzt. In diesem Fall wird der Lisp-Debugger aufgerufen. Die Ausführung kann in diesem Fall nicht mit dem Kommando `continue` fortgesetzt werden, da ein Syntax-Fehler aufgetreten ist. Jedoch ist es möglich, Maxima mit dem Kommando `(run)` vom Lisp-Prompt neu zu starten.

    (%i3) :lisp (setq *debugger-hook* nil)
    NIL
    (%i3) sqr(2,3);

    debugger invoked on a SB-INT:
       SIMPLE-PROGRAM-ERROR in thread #<THREAD
       "initial thread" RUNNING {C597F49}>:
      invalid number of arguments: 2

    Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

    restarts (invokable by number or by possibly-abbreviated name):
      0: [MACSYMA-QUIT] Maxima top-level
      1: [CONTINUE    ] Ignore runtime option --eval "(cl-user::run)".
      2: [ABORT       ] Skip rest of --eval and --load options.
      3:                Skip to toplevel READ/EVAL/PRINT loop.
      4: [QUIT        ] Quit SBCL (calling #'QUIT, killing the process).

    ($SQR 2)[:EXTERNAL]
    0] continue

    * (run)
    Maxima restarted.
    (%i4)

### 26.3 Funktionen und Variablen der Laufzeitumgebung

Systemvariable: maxima_tempdir ¶

  Die Systemvariable `maxima_tempdir` enthält das Verzeichnis, in dem Maxima temporäre Dateien ablegt. Insbesondere werden temporäre Grafikausgaben von Funktionen wie `plot2d` und `plot3d` in diesem Verzeichnis abgelegt. Der Standardwert von `maxima_tempdir` ist das Home-Verzeichnis des Nutzers, sofern Maxima dieses feststellen kann. Andernfalls initialisiert Maxima die Systemvariable `maxima_tempdir` mit einer geeigneten Annahme.

  Der Systemvariablen `maxima_tempdir` kann eine Zeichenkette zugewiesen werden, die ein Verzeichnis bezeichnet.

Systemvariable: maxima_userdir ¶

  Die Systemvariable `maxima_userdir` enthält ein Verzeichnis, das Maxima durchsucht, um Maxima- oder Lisp-Dateien zu finden. Der Standardwert der Systemvariablen `maxima_userdir` ist ein Unterverzeichnis des Home-Verzeichnis des Nutzers, sofern Maxima dieses bestimmen kann. Ansonsten initialisiert Maxima die Systemvariable `maxima_userdir` mit einer geeigneten Annahme. Dieses Verzeichnis ist zum Beispiel geeignet, um die Initialisisierungsdateien `maxima-init.mac` und `maxima-init.lisp` abzulegen.

  Maxima sucht in weiteren Verzeichnissen nach Dateien. Die vollständige Liste der Suchverzeichnisse ist den Variablen `file_search_maxima` und `file_search_lisp` enthalten.

  Der Systemvariablen `maxima_userdir` kann eine Zeichenkette zugewiesen werden, die ein Verzeichnis bezeichnet. Wenn der Wert von `maxima_userdir` geändert wird, werden die Variablen `file_search_maxima` und `file_search_lisp` nicht automatisch angepasst.

Funktion: room () ¶
Funktion: room (true) ¶
Funktion: room (false) ¶

  Gibt eine Beschreibung der Speicherplatznutzung aus. Die Darstellung und der Inhalt der Beschreibung hängt von dem Maxima zugrunde liegendem Lisp ab. Mit den Argumenten `true` und `false` kann der Umfang der auszugebenden Information kontrolliert werden, sofern die Option vom verwendeten Lisp unterstützt wird. Mit dem Argument `true` wird die umfangreichste Darstellung ausgegeben und mit dem Argument `false` die kürzeste.

  Beispiel:

  Das folgende Beispiel zeigt die Ausgabe auf einem Linux-System mit der Lisp-Implementierung SBCL 1.0.45.

      (%i1) room(false);
      Dynamic space usage is:   63,719,856 bytes.
      Read-only space usage is:      3,512 bytes.
      Static space usage is:         2,256 bytes.
      Control stack usage is:        1,440 bytes.
      Binding stack usage is:          184 bytes.
      Control and binding stack usage is for the current thread only.
      Garbage collection is currently enabled.
      (%o2)                         false

Funktion: sstatus (keyword, item) ¶

  Hat das Argument keyword den Wert `feature`, wird das Argument item der internen Lisp-Eigenschaftsliste `*features*` hinzugefügt. Das Kommando `status(feature, item)` hat dann das Ergebnis `true`. Hat das Argument keyword den Wert `nofeature`, wird das Argument item von der internen Lisp-Eigenschaftsliste `*features*` entfernt.

  Siehe auch die Funktion `status`.

Funktion: status (`feature`) ¶
Funktion: status (`feature`, item) ¶

  Das Kommando `status(feature)` gibt die interne Lisp-Eigenschaftsliste `*features*` zurück. `status(feature,item)` gibt `true` zurück, wenn das Argument item in der internen Lisp-Eigenschaftsliste `*features*` enthalten ist. Ansonsten ist die Rückgabe `false`. `status` wertet die Argumente nicht aus. Eine Systemeigenschaft item, die Sonderzeichen wie `-` oder `*` enthält, muss als Zeichenkette angegeben werden.

  Siehe auch die Funktion `sstatus`.

  Die Lisp-Variable `*features*` steht in keinem Zusammenhang mit der Maxima-Systemvariablen `features`, die eine Liste mit mathematischen Eigenschaften enthält, die Funktionen und Variablen erhalten können.

  Beispiel:

  Das folgende Beispiel zeigt die Ausgabe für ein Linux-System mit SBCL als Lisp. Die Ausgabe ist abgekürzt.

      (%i1) status(feature);
      (%o1) [sb-bsd-sockets-addrinfo, asdf2, asdf, cl, mk-defsystem,
      cltl2, ansi-cl, common-lisp, sbcl, ...]

      (%i2) status(feature,"ansi-cl");
      (%o2)                         true

Funktion: system (command) ¶

  `system(command)` führt das Kommando command in einem eigenen Prozess aus. Das Kommando wird an die Standard-Shell übergeben. `system` wird nicht von allen Betriebssystemen unterstützt, steht aber im Allgemeinen unter Unix oder Unix ähnlichen Betriebssystemen zur Verfügung.

Funktion: time (%o1, %o2, %o3, …) ¶

  Gibt eine Liste mit den Ausführungszeiten zurück, die benötigt wurden, um die Ergebnisse `%o1`, `%o2`, `%o3`, … zu berechnen. Die Argumente der Funktion `time` können nur Ausgabemarken sein. Für andere Argumente ist das Ergebnis `unknown`.

  Siehe die Optionsvariable `showtime`, um die Ausführungszeiten für jede einzelne Berechnung anzuzeigen.

  Beispiel:

  Die Zeit für die Berechnung der Fakultät einer großen ganzen Zahl wird mit `time` ausgegeben.

      (%i1) factorial(100000)$

      (%i2) time(%o1);
      (%o2)                        [7.589]

Funktion: timedate () ¶

  Gibt eine Zeichenkette zurück, die das aktuelle Datum und die aktuelle Zeit enthält. Die Zeichenkette hat das Format `yyyy-mm-dd HH:MM:SS (GMT-n)`.

  Beispiel:

      (%i1) timedate();
      (%o1)               2010-12-28 21:56:32+01:00

Funktion: absolute_real_time () ¶

  Gibt die Sekunden zurück, die seit dem 1. Januar 1990 UTC verstrichen sind. Die Rückgabe ist eine ganze Zahl.

  Siehe auch `elapsed_real_time` und `elapsed_run_time`.

  Beispiel:

      (%i1) absolute_real_time ();
      (%o1)                      3502559124
      (%i2) truncate(1900+absolute_real_time()/(365.25*24*3600));
      (%o2)                         2010

Funktion: elapsed_real_time () ¶

  Gibt die Sekunden zurück, die seit dem letzten Start von Maxima verstrichen sind. Die Rückgabe ist eine Gleitkommazahl.

  Siehe auch `absolute_real_time` und `elapsed_run_time`.

  Beispiel:

      (%i1) elapsed_real_time ();
      (%o1)                       2.559324
      (%i2) expand ((a + b)^500)$
      (%i3) elapsed_real_time ();
      (%o3)                       7.552087

Funktion: elapsed_run_time () ¶

  Gibt eine Schätzung der Zeit in Sekunden zurück, die Maxima für Berechnungen seit dem letzten Start benötigt hat. Der Rückgabewert ist eine Gleitkommazahl.

  Siehe auch `absolute_real_time` und `elapsed_real_time`.

  Beispiel:

      (%i1) elapsed_run_time ();
      (%o1)                         0.04
      (%i2) expand ((a + b)^500)$
      (%i3) elapsed_run_time ();
      (%o3)                         1.26