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 /  Evaluierung von Ausdrücken /

Das Standard-EvaluierungsverfahrenEvaluierung in Mustern, Regeln und Definitionen

2.5.5 Nichtstandardmäßige Evaluierung

Obwohl die meisten eingebauten Mathematica-Funktionen dem Standard-Evaluierungsverfahren folgen, ist dies für einige wichtige nicht der Fall. Zum Beispiel verwenden die meisten der Mathematica-Funktionen, die mit der Konstruktion und Ausführung von Programmen verknüpft sind, nichtstandardmäßige Evaluierungsverfahren. In typischen Fällen evaluieren die Funktionen entweder einige ihrer Argumente nie oder nur unter eigener Kontrolle und auf spezielle Weise.

Einige Funktionen, die nichtstandardmäßige Evaluierungsverfahren verwenden

Wenn Sie eine Definition, wie zum Beispiel a = 1, aufstellen, versucht Mathematica nicht, das a zu evaluieren, das auf der linken Seite vorhanden ist. Sie können sehen, daß es Schwierigkeiten geben würde, wenn das a evaluiert würde. Wenn Sie nämlich zuvor a = 7 gesetzt hätten, würde die Evaluierung von a in der Definition a = 1 die Definition in die unsinnige Form 7 = 1 überführen.

Im Standard-Evaluierungsverfahren wird jedes Argument einer Funktion der Reihe nach evaluiert. Dies wird verhindert, indem die Attribute HoldFirst, HoldRest und HoldAll gesetzt werden. Diese Attribute führen dazu, daß Mathematica bestimmte Argumente in einer unevaluierten Form „hält".

Attribute, mit denen Funktionsargumente in unevaluierter Form gehalten werden können

Beim Standard-Evaluierungsverfahren werden alle Argumente einer Funktion evaluiert.

In[1]:= f[1 + 1, 2 + 4]

Out[1]=

Dies weist h das Attribut HoldFirst zu.

In[2]:= SetAttributes[h, HoldFirst]

Das erste Argument von h wird jetzt in einer unevaluierten Form gehalten.

In[3]:= h[1 + 1, 2 + 4]

Out[3]=

Wenn Sie das erste Argument von h wie hier verwenden, wird es evaluiert.

In[4]:= h[1 + 1, 2 + 4] /. h[x_, y_] -> x^y

Out[4]=

Eingebaute Funktionen, wie zum Beispiel Set, tragen Attribute wie etwa HoldFirst.

In[5]:= Attributes[Set]

Out[5]=

Auch wenn eine Funktion Attribute haben mag, die angeben, daß sie bestimmte Argumente in unevaluierter Form halten soll, können Sie Mathematica immer explizit anweisen, daß es diese Argumente evaluieren soll, indem Sie die Argumente in der Form Evaluate[arg] angeben.

Evaluate setzt im Grunde das Attribut HoldFirst außer Kraft und bewirkt, daß das erste Argument evaluiert wird.

In[6]:= h[Evaluate[1 + 1], 2 + 4]

Out[6]=

Erzwungene Evaluierung von Funktionsargumenten

Durch das Halten von Argumenten kann eine Funktion kontrollieren, wann diese Argumente evaluiert werden. Mit Evaluate läßt sich erzwingen, daß diese Argumente sofort evaluiert werden, anstatt erst unter Kontrolle der Funktion. Diese Möglichkeit erweist sich bei vielen Gelegenheiten als äußerst nützlich.

Ein Beispiel (siehe dazu Abschnitt 1.9.1) erhält man, wenn man die Graphen von Ausdrücken zeichnet. Die Mathematica-Plot-Funktion hält den Ausdruck, der gerade gezeichnet werden soll, unevaluiert, und evaluiert ihn dann für eine Reihe numerischer Positionen. In einigen Fällen möchten Sie möglicherweise stattdessen, daß der Ausdruck sofort evaluiert wird und daß Plot mit der evaluierten Form arbeitet. Wenn Sie zum Beispiel eine Liste mit Funktionen zeichnen wollen, die durch Table erzeugt wird, dann werden Sie wollen, daß die Table-Operation sofort ausgeführt wird, anstatt jedesmal, wenn ein Punkt gezeichnet werden soll.

Evaluate bewirkt, daß die Liste mit Funktionen sofort konstruiert wird, statt daß sie bei jedem von Plot gewählten Wert von x konstruiert wird.

In[7]:= Plot[
Evaluate[Table[Sin[n x], {n, 1, 3}]],
{x, 0, 2Pi} ]

Out[7]=

Es gibt eine Reihe eingebauter Mathematica-Funktionen, die so konstruiert sind, daß sie so wie Plot einige ihrer Argumente unevaluiert halten. Sie können dieses Verhalten immer mit Evaluate außer Kraft setzen.

Die Mathematica-Set-Funktion hält ihr erstes Argument, deshalb wird in diesem Fall das Symbol a nicht evaluiert.

In[8]:= a = b

Out[8]=

Sie können mit Evaluate erreichen, daß Set das erste Argument evaluiert. In diesem Fall ergibt sich als Objekt der Wert von a, so daß b gleich 6 gesetzt wird.

In[9]:= Evaluate[a] = 6

Out[9]=

Jetzt wurde b gleich 6 gesetzt.

In[10]:= b

Out[10]=

Zumeist möchten Sie, daß alle Mathematica übergebenen Ausdrücke evaluiert werden. Mitunter möchten Sie jedoch die Evaluierung bestimmter Ausdrücke verhindern. Wenn Sie zum Beispiel die Teile eines Mathematica-Programmes symbolisch manipulieren wollen, dann müssen Sie diese Teile davor bewahren, daß sie während der Manipulation evaluiert werden.

Mit den Funktionen Hold und HoldForm lassen sich Ausdrücke unevaluiert halten. Dies geschieht einfach dadurch, daß sie das Attribut HoldAll tragen, das ihre Argumente davor bewahrt, evaluiert zu werden. Diese Funktionen bieten „Hüllen", in denen Ausdrücke unevaluiert bleiben.

Der Unterschied zwischen Hold[ausdr] und HoldForm[ausdr] besteht darin, daß im normalen Mathematica-Ausgabeformat Hold explizit gedruckt wird, HoldForm hingegen nicht. Wenn Sie die vollständige interne Mathematica-Form betrachten, können Sie jedoch beide Funktionen sehen.

Hold bewahrt Ausdrücke in einer nicht evaluierten Form.

In[11]:= Hold[1 + 1]

Out[11]=

HoldForm bewahrt Ausdrücke vor der Evaluierung, ist jedoch im normalen Mathematica-Ausgabeformat unsichtbar.

In[12]:= HoldForm[1 + 1]

Out[12]=

HoldForm ist intern immer noch vorhanden.

In[13]:= FullForm[%]

Out[13]//FullForm=

Die Funktion ReleaseHold entfernt Hold und HoldForm, so daß die Ausdrücke, die diese enthalten, evaluiert werden.

In[14]:= ReleaseHold[%]

Out[14]=

Funktionen zur Verarbeitung unevaluierter Ausdrücke

Sobald Sie Teile von Ausdrücken herausziehen, werden diese gewöhnlich evaluiert.

In[15]:= Extract[ Hold[1 + 1, 2 + 3], 2]

Out[15]=

Auf diese Weise wird ein Teil herausgezogen und sofort mit Hold eingehüllt, damit es nicht evaluiert wird.

In[16]:= Extract[ Hold[1 + 1, 2 + 3], 2, Hold]

Out[16]=

Das letzte Argument 1 weist ReplacePart an, den ersten Teil von Hold[7 + 8] herauszuziehen und dann diesen einzufügen.

In[17]:= ReplacePart[ Hold[1 + 1, 2 + 3], Hold[7 + 8], 2, 1]

Out[17]=

Zeitweise Verhinderung der Argument-Evaluierung

1 + 1 evaluiert zu 2, und Length[2] ergibt 0.

In[18]:= Length[1 + 1]

Out[18]=

Dies ergibt die unevaluierte Form 1 + 1 als das Argument von Length.

In[19]:= Length[Unevaluated[1 + 1]]

Out[19]=

Unevaluated[ausdr] funktioniert so, daß es einer Funktion zeitweise ein Attribut wie HoldFirst gibt und dann der Funktion ausdr als Argument übergibt.

Attribute zur Verhinderung anderer Evaluations-Aspekte

Durch Setzen des Attributes HoldAll läßt sich vermeiden, daß Mathematica die Argumente einer Funktion evaluiert. Aber auch wenn dieses Attribut gesetzt ist, wird Mathematica immer noch Argumente transformieren. Durch Setzen von SequenceHold läßt sich verhindern, daß Sequence-Objekte eingeebnet werden, die in den Argumenten erscheinen. Und durch Setzen von HoldAllComplete läßt sich auch das Entfernen von Unevaluated verhindern sowie vermeiden, daß Mathematica irgendwelche Auf-Werte verwendet, die es mit den Argumenten verknüpft vorfindet.

Das Standard-EvaluierungsverfahrenEvaluierung in Mustern, Regeln und Definitionen