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

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  Evaluierung von Ausdrücken /

Trace der EvaluierungFortgeschrittenes Thema: Kontrolle unendlicher Evaluierung

2.5.11 Fortgeschrittenes Thema: Der Evaluierungsstapel

Während jeder Berechnung verwaltet Mathematica einen Evaluierungsstapel, der die Ausdrücke enthält, die es gerade evaluiert. Mit der Funktion Stack können Sie sich den Stapel anschauen. So ist es zum Beispiel möglich, mit Stack herauszufinden, was Mathematica macht, wenn Sie Mathematica inmitten einer Berechnung unterbrechen.

Der Ausdruck, den Mathematica als letztes zu evaluieren begann, erscheint immer als das letzte Element des Evaluierungsstapels. Die vorhergehenden Elemente des Stapels sind die anderen Ausdrücke, deren Evaluierung gerade abläuft.

Deshalb wird zu dem Zeitpunkt, da x gerade evaluiert wird, der Stapel, der zur Evaluierung eines Ausdrucks wie f [g[x]] gehört, die Form f [g[x]], g[x], x haben.

Stack[_] liefert die Ausdrücke, die zum Zeitpunkt des Aufrufs evaluiert werden, in diesem Fall auch die Print-Funktion.

In[1]:= f[g[ Print[Stack[_]] ]] ;

Stack[ ] liefert die Etiketten, die zu den Evaluierungen gehören, die zum Zeitpunkt des Aufrufs gerade stattfinden.

In[2]:= f[g[ Print[Stack[ ]] ]] ;

Im Prinzip können Sie sich den Evaluierungsstapel so vorstellen: Er zeigt, welche Funktionen welche anderen Funktionen aufriefen, um zu dem Punkt in Ihrer Berechnung zu gelangen, an dem Mathematica gerade ist. Die Ausdrucksfolge entspricht den ersten Elementen in den aufeinanderfolgenden verschachtelten Listen, die von Trace mit der Option TraceAbove gleich True zurückgegeben wurden.

Den Evaluierungsstapel anschauen

Sie werden Stack ziemlich selten direkt in Ihrer Haupt-Mathematica-Session aufrufen. Häufiger werden Sie Stack während einer Berechnung aufrufen wollen. Dies können Sie in der Regel aus einem Dialog oder einer untergeordneten Session heraus tun (siehe Abschnitt 2.13.2).

Hier ist die übliche rekursive Definition der Fakultätsfunktion.

In[3]:= fac[1] = 1; fac[n_] := n fac[n-1]

Dies evaluiert fac[10] und beginnt einen Dialog, sobald fac[4] auftritt.

In[4]:= TraceDialog[fac[10], fac[4]]

Out[5]=

Dies zeigt, welche Objekte gerade evaluiert wurden, als der Dialog gestartet wurde.

In[6]:= Stack[ ]

Out[6]=

Dies beendet den Dialog.

In[7]:= Return[ ]

Out[4]=

In den einfachsten Fällen ist der Mathematica-Evaluierungsstapel so konstruiert, daß er alle Ausdrücke aufzeichnet, die gerade evaluiert werden. Unter bestimmten Umständen kann dies jedoch unvorteilhaft sein. Zum Beispiel wird die Ausführung von Print[Stack[ ]] immer einen Stapel mit Print als letzte Funktion zeigen.

Mit der Funktion StackInhibit können Sie dieses Problem vermeiden. StackInhibit[ausdr] evaluiert ausdr, ohne den Stapel zu modifizieren.

StackInhibit verhindert, daß Print auf den Stapel gelegt wird.

In[5]:= f[g[ StackInhibit[Print[Stack[ ]]] ]] ;

Out[5]=

Funktionen wie TraceDialog rufen jedesmal, wenn sie einen Dialog beginnen, automatisch StackInhibit auf. Deshalb zeigt Stack keine Funktionen, die innerhalb des Dialoges aufgerufen werden, nur die außerhalb.

Kontrolle des Evaluierungsstapels

Mit StackInhibit und StackBegin läßt sich kontrollieren, welche Teile des Evaluierungsverfahrens auf dem Stapel erfaßt werden. StackBegin[ausdr] evaluiert ausdr und beginnt dabei mit einem neuen Stapel. Deshalb enthält der Stapel während der Evaluierung von ausdr nichts außerhalb von StackBegin. Funktionen wie TraceDialog[ausdr, ... ] rufen StackBegin auf, ehe sie mit der Evaluierung von ausdr beginnen, so daß der Stapel zeigt, wie ausdr evaluiert wird, aber nicht, wie TraceDialog aufgerufen wurde.

StackBegin[ausdr] verwendet zur Evaluierung von ausdr einen neuen Stapel.

In[6]:= f[ StackBegin[ g[h[ StackInhibit[Print[Stack[ ]]] ]] ] ]

Out[6]=

Stack zeigt Ihnen normalerweise nur jene Ausdrücke, die gerade evaluiert werden. Deshalb führt es nur die letzte Form jeden Ausdrucks auf. Mitunter werden Sie es jedoch nützlich finden, auch die früheren Formen der Ausdrücke zu sehen. Dies erreichen Sie mit StackComplete.

Im Grunde bewahrt StackComplete[ausdr] die vollständige Evaluierungskette für jeden Ausdruck, der gerade evaluiert wird, auf dem Stapel. In diesem Fall entspricht der Stapel der Ausdrucksfolge, die durch Trace mit der Option TraceBackward -> All sowie TraceAbove -> True erhalten wird.

Trace der EvaluierungFortgeschrittenes Thema: Kontrolle unendlicher Evaluierung