This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.1)

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  Modularität und die Benennung von Dingen /

Kontexte und PaketeAutomatisches Laden von Paketen

2.6.10 Konstruktion von Mathematica-Paketen

In einem typischen Mathematica-Paket werden im allgemeinen zwei Arten neuer Symbole eingeführt. Zum einen gibt es die, die Sie zur Nutzung außerhalb des Paketes „exportieren" wollen. Zum anderen gibt es jene, die Sie nur innerhalb eines Pakets einsetzen wollen. Sie können diese zwei Symbolarten unterscheiden, indem Sie sie in unterschiedliche Kontexte setzen.

Es ist üblich, für den Export vorgesehene Symbole in einen Kontext mit Namen Paket` zu setzen, der dem Namen des Pakets entspricht. Wenn das Paket eingelesen wird, fügt es diesen Kontext dem Kontext-Suchpfad hinzu, so daß die Symbole in diesem Kontext mit ihrem Kurznamen angesprochen werden können.

Symbole, die nicht für den Export, sondern stattdessen für die interne Benutzung im Paket vorgesehen sind, werden nach Übereinkunft in einen Kontext mit dem Namen Paket`Private` gesetzt. Dieser Kontext wird dem Kontext-Suchpfad nicht hinzugefügt. Deshalb kann auf die Symbole in diesem Kontext nur durch Angabe ihrer vollständigen Namen zugegriffen werden.

Nach Übereinkunft in Mathematica-Paketen benutzte Kontexte

Es gibt eine Standardfolge von Mathematica-Befehlen, die normalerweise benutzt wird, um in einem Paket einen Kontext anzulegen. Diese Befehle legen die Werte von $Context und $ContextPath so fest, daß die neu eingeführten Symbole in passenden Kontexten erzeugt werden.

Die Standardfolge von Kontext-Kontroll-Befehlen in einem Paket

BeginPackage["Collatz`"]



Collatz::usage =

"Collatz[n] liefert eine Liste der Iterationen des 3n+1 Problems,

beginnend bei n. Die Vermutung ist, daß die Folge immer abbricht."



Begin["`Private`"]



Collatz[1] := {1}



Collatz[n_Integer] := Prepend[Collatz[3 n + 1], n] /; OddQ[n] && n > 0



Collatz[n_Integer] := Prepend[Collatz[n/2], n] /; EvenQ[n] && n > 0



End[ ]



EndPackage[ ]

Das Beispiel-Paket Collatz.m.

Die Übereinkunft, usage-Meldungen zu Beginn eines Pakets zu definieren, ist im Grunde ein Trick zur Erzeugung von Symbolen, die Sie aus dem jeweiligen Kontext exportieren wollen. Der springende Punkt ist, daß bei der Definition dieser Mitteilungen genau jene Symbole erwähnt werden, die Sie auch exportieren wollen. Diese Symbole werden im Kontext Paket` erzeugt, der dann der aktuelle Kontext ist.

In den eigentlichen Definitionen der Funktionen in einem Paket gibt es in der Regel viele neue Symbole, die als Parameter, temporäre Variablen usw. eingeführt werden. Nach Übereinkunft werden alle diese Symbole in den Kontext Paket`Private` gesetzt, der beim Einlesen des Paketes nicht auf den Kontext-Suchpfad gelegt wird.

Hier wird das oben angegebene Beispiel-Paket eingelesen.

In[1]:= <<Collatz.m

Die EndPackage-Anweisung im Paket fügt den Kontext, der zum Paket gehört, in den Kontext-Suchpfad ein.

In[2]:= $ContextPath

Out[2]=

Die Funktion Collatz wurde im Kontext Collatz` erzeugt.

In[3]:= Context[Collatz]

Out[3]=

Der Parameter n wird in den privaten Kontext Collatz`Private` gesetzt.

In[4]:= ?Collatz`Private`*

Im Collatz-Paket hängen die definierten Funktionen nur von eingebauten Mathematica-Funktionen ab. Oft hängen jedoch die in einem Paket definierten Funktionen von solchen ab, die in einem anderen Paket definiert sind.

Zwei Dinge sind erforderlich, damit dies funktioniert. Zuerst muß das andere Paket eingelesen werden, damit die benötigten Funktionen definiert sind. Zweitens muß der Kontext-Suchpfad den Kontext enthalten, in dem sich diese Funktionen befinden.

Mit dem Befehl <<kontext` können Sie Mathematica jederzeit explizit anweisen, ein Paket einzulesen. (In Abschnitt 2.11.5 wird das heikle Thema der Übersetzung von systemunabhängigen Kontextnamen in systemabhängige Dateinamen erörtert.) Oft möchten Sie es jedoch so einrichten, daß ein bestimmtes Paket erst dann eingelesen wird, wenn es gebraucht wird. Der Befehl Needs["kontext`"] weist Mathematica an, ein Paket einzulesen, wenn der zum Paket gehörige Kontext sich nicht bereits in der Liste $Packages befindet.

Funktionen zur Spezifizierung gegenseitiger Abhängigkeit von Paketen

Wenn Sie BeginPackage["Paket`"] mit einem einzigen Argument benutzen, so fügt Mathematica nur den Paket`-Kontext und den Kontext für eingebaute Mathematica-Symbole in den Kontext-Suchpfad ein. Wenn Ihre Definitionen in Ihrem Paket Funktionen aus anderen Paketen enthalten, so müssen Sie sicherstellen, daß sich die Kontexte dieser Pakete auch in Ihrem Kontext-Suchpfad befinden. Sie erreichen dies, indem Sie BeginPackage als zweites Argument eine Liste der zusätzlichen Kontexte übergeben. BeginPackage wendet automatisch Needs auf diese Kontexte an, liest die entsprechenden Pakete, wenn nötig, ein, und stellt sicher, daß sich die Kontexte im Kontext-Suchpfad befinden.

Kontextmanipulierende Funktionen

Die Ausführung einer Funktion wie Begin, die Kontexte manipuliert, ändert die Art, wie Mathematica von Ihnen eingegebene Namen interpretiert. Sie sollten jedoch wissen, daß eine Änderung nur in Ausdrücken wirksam wird, die Sie anschließend eingeben. Denn Mathematica liest immer einen vollständigen Eingabeausdruck und interpretiert die darin enthaltenen Namen, ehe es irgendeinen Teil des Ausdrucks ausführt. Daher sind die Namen im Ausdruck bereits interpretiert, wenn Begin in einem bestimmten Ausdruck ausgeführt wird, und somit hat Begin keine Wirkung mehr.

Die Tatsache, daß kontextmanipulierende Funktionen keine Wirkung haben, bis der nächste vollständige Ausdruck eingelesen wird, bedeutet, daß Sie beim Schreiben der Mathematica-Pakete sicherstellen müssen, daß diese Funktionen als separate Ausdrücke eingegeben werden, in der Regel auf separaten Zeilen.

Der Name x wird vor der Ausführung des Ausdrucks interpretiert, daher hat Begin keine Wirkung.

In[5]:= Begin["a`"]; Print[Context[x]]; End[ ]

Out[5]=

Kontextmanipulierende Funktionen werden primär als Teil von Paketen benutzt, die von Mathematica eingelesen werden sollen. Manchmal ist es jedoch zweckmäßig, solche Funktionen interaktiv zu benutzen.

Dies kann sein, wenn Sie beispielsweise mit TraceDialog einen Dialog beginnen, während Sie eine Funktion ausführen, die in einem Paket definiert ist. Die Parameter und temporären Variablen der Funktion befinden sich in der Regel in einem privaten Kontext, der mit dem Paket verbunden ist. Da der Kontext sich nicht in Ihrem Kontext-Suchpfad befindet, wird Mathematica die vollständigen Namen der Symbole ausdrucken und erwartet von Ihnen, daß Sie diese vollständigen Namen eintippen, wenn Sie die Symbole ansprechen wollen. Sie können jedoch mit Begin["Paket`Private`"] den privaten Kontext des Pakets zu Ihrem aktuellen Kontext machen. Dies veranlaßt Mathematica, die Kurznamen der Symbole zu drucken, und erlaubt Ihnen, auf die Symbole auch mit ihren Kurznamen zu verweisen.

Kontexte und PaketeAutomatisches Laden von Paketen