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 /

Lokale KonstantenFortgeschrittenes Thema: Variablen in reinen Funktionen und in Regeln

2.6.3 Wie Module funktionieren

Die Module in Mathematica funktionieren im Grunde auf recht einfache Weise. Immer wenn ein Modul benutzt wird, wird für jede seiner lokalen Variablen ein neues Symbol erzeugt. Das neue Symbol erhält einen eindeutigen Namen, der mit keinem anderen Namen in Konflikt stehen kann. Der Name wird gebildet, indem dem Namen der von Ihnen spezifizierten lokalen Variablen ein $ sowie eine eindeutige „Seriennummer" angefügt werden.

Die Seriennummer wird mit Hilfe des Wertes der globalen Variablen $ModuleNumber bestimmt. Diese Variable zählt, wie häufig ein beliebiges Module von beliebiger Form benutzt worden ist.

Das Grundprinzip von Modulen in Mathematica

Dies zeigt das im Modul für t erzeugte Symbol.

In[1]:= Module[{t}, Print[t]]

Jedesmal, wenn ein Modul benutzt wird, ergeben sich andere Symbole.

In[2]:= Module[{t, u}, Print[t]; Print[u]]

Für die meisten Zwecke müssen Sie niemals direkt mit den innerhalb der Module erzeugten Symbolen umgehen. Wenn Sie jedoch zum Beispiel einen Dialog starten, während ein Modul ausgeführt wird, so sehen Sie diese Symbole. Das gleiche geschieht, wenn Sie eine Funktion wie Trace benutzen, um die Evaluierung von Modulen zu beobachten.

Mit Trace sehen Sie die Symbole, die innerhalb der Module erzeugt werden.

In[3]:= Trace[ Module[{t}, t = 3] ]

Out[3]=

So wird ein Dialog innerhalb eines Moduls gestartet.

In[4]:= Module[{t}, t = 6; Dialog[ ]]

Innerhalb des Dialoges sehen Sie die Symbole, die für die lokalen Variablen, wie hier t, erzeugt werden.

In[5]:= Stack[_]

Out[5]=

Mit diesen Symbolen können Sie genauso wie auch mit anderen arbeiten.

In[6]:= t$4 + 1

Out[6]=

Damit kehren Sie aus dem Dialog zurück.

In[7]:= Return[t$4 ^ 2]

Out[4]=

Unter gewissen Umständen ist es angebracht, innerhalb von Modulen erzeugte Symbole explizit zurückzugeben.

Innerhalb von Modulen erzeugte Symbole können Sie explizit zurückgeben.

In[5]:= Module[{t}, t]

Out[5]=

Sie können diese Symbole genauso wie andere behandeln.

In[6]:= %^2 + 1

Out[6]=

Erzeugen neuer Symbole mit eindeutigen Namen

Mit der Funktion Unique können Sie neue Symbole auf die gleiche Weise, wie es Module macht, erzeugen. Immer wenn Sie Unique aufrufen, wird $ModuleNumber inkrementiert, und dadurch wird sichergestellt, daß der Name des neuen Symbols eindeutig ist.

Dies erzeugt ein eindeutiges neues Symbol, dessen Name mit x beginnt.

In[7]:= Unique[x]

Out[7]=

Immer wenn Sie Unique aufrufen, erhalten Sie ein Symbol mit einer größeren Seriennummer.

In[8]:= {Unique[x], Unique[x], Unique[x]}

Out[8]=

Wenn Sie Unique mit einer Namensliste aufrufen, erhalten Sie für jedes einzelne der Symbole die gleiche Seriennummer.

In[9]:= Unique[{x, xa, xb}]

Out[9]=

Mit dem bekannten Mathematica-Mechanismus ?name lassen sich Informationen über Symbole erhalten, die innerhalb von Modulen oder durch die Funktion Unique erzeugt wurden.

Bei der Ausführung dieses Moduls wird das Symbol q$nnn erzeugt.

In[10]:= Module[{q}, q^2 + 1]

Out[10]=

Hier sehen Sie das erzeugte Symbol.

In[11]:= ?q*

q q$12

Symbole, die durch Module erzeugt wurden, verhalten sich bei der Evaluierung exakt in der gleichen Weise wie andere Symbole. Diese Symbole besitzen jedoch das Attribut Temporary, das angibt, daß sie vollständig zu entfernen sind, sobald sie nicht mehr benutzt werden. Folglich werden die meisten Symbole, die innerhalb von Modulen erzeugt worden sind, entfernt, sobald die Ausführung dieser Module beendet ist. Die Symbole bleiben nur erhalten, wenn sie explizit zurückgegeben werden.

Dies zeigt eine neue Variable q, die innerhalb eines Moduls erzeugt wurde.

In[12]:= Module[{q}, Print[q]]

Die neue Variable wird entfernt, sobald die Ausführung des Moduls beendet ist. Daher erscheint sie hier nicht mehr.

In[13]:= ?q*

q q$12

Beachten Sie, daß die Benutzung von Namen für erzeugte Symbole, wie beispielsweise x$nnn, ausschließlich eine Übereinkunft ist. Sie können im Prinzip jedem beliebigen Symbol einen Namen dieser Form geben. Aber wenn Sie dies tun, so kann das Symbol unter Umständen in Namenskonflikt mit einem durch Module erzeugten Namen geraten.

Beachten Sie auch folgenden wichtigen Punkt: Symbole, die durch Module erzeugt wurden, sind im allgemeinen lediglich innerhalb einer bestimmten Mathematica-Session eindeutig. Die Variable $ModuleNumber, die die Seriennummer dieser Symbole festlegt, wird zu Beginn jeder Session zurückgesetzt.

Dies bedeutet insbesonders, daß Namenskonflikte nicht auszuschließen sind, wenn Sie Ausdrücke, die erzeugte Symbole enthalten, in einer Datei sichern, und sie dann während einer anderen Session wieder einlesen.

Derartige Namenskonflikte kann man zum Beispiel vermeiden, indem man $ModuleNumber am Anfang jeder Session explizit anders festlegt. Wenn Sie $ModuleNumber = 10^10 $SessionID setzen, sollte jeder Konflikt vermieden werden können. Die globale Variable $SessionID sollte eine eindeutige Nummer ergeben, die eine bestimmte Mathematica-Session auf einem bestimmten Computer charakterisiert. Der Wert dieser Variablen wird durch solche Größen bestimmt wie das absolute Datum und die Zeit, die ID des Computers und, falls vorhanden, die ID des Mathematica-Prozesses.

Variablen zur Festlegung von Seriennummern für erzeugte Symbole

Nachdem geeignete Symbole zur Darstellung der von Ihnen spezifizierten lokalen Variablen erzeugt worden sind, muß Module[vars, rumpf] mit diesen Symbolen rumpf evaluieren. Im ersten Schritt wird der Ausdruck rumpf genommen, so wie er innerhalb des Moduls erscheint, und dann werden im Grunde mit With alle Vorkommnisse der lokalen Variablennamen durch die entsprechend erzeugten Symbole ersetzt. Danach wird Module den sich ergebenden Ausdruck tatsächlich evaluieren.

Ein wichtiger Punkt, den es zu beachten gilt: Module[vars, rumpf] fügt erzeugte Symbole nur in den eigentlichen Ausdruck rumpf ein. Derartige Symbole werden beispielsweise nicht in Code eingefügt, der zwar von rumpf aufgerufen wird, aber nicht explizit in rumpf erscheint.

In Abschnitt 2.6.6 wird beschrieben, wie man mit Block „lokale Werte" anlegt, die sich anders verhalten.

Da x nicht explizit im Rumpf des Moduls erscheint, wird der lokale Wert nicht benutzt.

In[14]:= tmp = x^2 + 1; Module[{x = 4}, tmp]

Out[14]=

Meistens werden Sie Module wahrscheinlich durch eine explizite Mathematica-Eingabe der Form Module[vars, rumpf] anlegen. Da die Funktion Module das Attribut HoldAll hat, bleibt die Form von rumpf gewöhnlich so lange unevaluiert, bis das Modul ausgeführt wird.

Es ist jedoch möglich, Module in Mathematica dynamisch anzulegen. Die Erzeugung neuer Symbole sowie ihre Einfügung in rumpf erfolgen stets nur dann, wenn ein Modul tatsächlich ausgeführt wird, und nicht gleich bei der Eingabe des Moduls in Mathematica.

Dies evaluiert den Rumpf des Moduls sofort und läßt x explizit erscheinen.

In[15]:= tmp = x^2 + 1; Module[{x = 4}, Evaluate[tmp]]

Out[15]=

Lokale KonstantenFortgeschrittenes Thema: Variablen in reinen Funktionen und in Regeln