Die Evaluation geschieht durch die Anwendung von Definitionen
Mathematica ist ein ,,infinite evaluation system``
Das bedeutet, daß es
In[2]:= x1
Out[2]= 14
Obwohl x2 erst nach x1 definiert wurde, erhält man das
korrekte Ergebnis.
In[4]:= x:=0 /; (t = t+1 ; t > 3)
Out[4]=
In[5]:= x
Out[5]= x
t=1
In[6]:= x
Out[6]= x
t=2
In[7]:= x
Out[7]= x
t=3
In[8]:= x
Out[8]= 0
t=4: Mathematica ist doch kein ,,infinite evaluation system``.
Obwohl (oberflächlich betrachtet) keine Regel geändert wurde, erhält man
plötzlich ein anderes Ergebnis.
Zugegeben, t
wird hochgezählt und ändert damit den Inhalt der
Datenbank von Mathematica, an der Definition von x
ändert sich aber nichts.
Wie untersucht Mathematica eine Eingabe, eine expression
In[9]:= [, ,..., ]
Out[9]=
die dem Kernel vom Front End übergeben wird?
a /; a:=b
a[1][A, {1, 2}]
HoldFirst
, HoldRest
und HoldAll
.
In[11]:= f[a_]:=a^2
Out[11]=
In[12]:= g:=f
Out[12]=
In[13]:= g[5]
Out[13]= 25
In Schritt 3 wird g durch f ersetzt, die
Evaluation Sequence von neuem begonnen und in Schritt 6 das Ergebnis
berechnet.
Immediate Assignment: =
interne Speicherung: Set[, ]
kann eine beliebige expression oder ein Muster sein. Verschiedene Zuweisungen, die einem bestimmten Symbol zugeordnet sind, werden in der Reihenfolge der Eingabe gespeichert, außer sie ist spezifischer als die vorhergehenden. In diesem Fall wird das Muster vorangestellt. Neue Zuweisungen mit identischer überschreiben alte Einträge.
Ist die Eingabe von der Form
In[14]:= [,..., ]=
Out[14]=
so werden die Argumente bis ausgewertet. und [,..., ] bleiben unverändert im Gegensatz zu , das sofort ausgewertet wird.
Delayed Assignment: :=
interne Speicherung: SetDelayed[, ] mit dem Attribut
HoldAll.
Der Unterschied zum Immediate Assignment besteht in der Behandlung von . Diese wird beim Delayed Assignment nicht ausgewertet. Sobald im weiteren auftritt, wird es durch ersetzt. Erst dann wird ausgewertet.
In[15]:= [,..., ]:=
Out[15]=
Analoges gilt in diesem Fall: Alle Argumente werden evaluiert. und [,..., ] werden nicht weiter ausgewertet. Außerdem bleibt unverändert stehen.
Immediate Assignment | Delayed Assignment | |
In[16]:= a:=5 | ||
In[17]:= f[x_] = a x | In[17]:= f[x_] := ax | |
Out[17]= 5x | keine Ausgabe | |
f/: f[x_] = 5*x | Musterdatenbank | f/: f[x_] := a*x |
In[18]:= a:=9; f[4] | ||
5 4 | a 4 9 4 | |
Out[18]= 20 | Out[18]= 36 |