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 ![]() ![]() |
a ![]() ![]() ![]() ![]() |
|
Out[18]= 20 | Out[18]= 36 |