Natychmiastowe i opóźnione definicje 

http://reference.wolfram.com/mathematica/tutorial/ImmediateAndDelayedDefinitions.html

Immediate and Delayed Definitions

“You may have noticed that there are two different ways to make assignments in Mathematica:
lhs=rhs
and
lhs:=rhs.
The basic difference between these forms is when the expression rhs is evaluated.
lhs=rhs is an immediate assignment,in which rhs is evaluated at the time when the assignment is made. 
lhs:=rhs, on the other hand, is a delayed assignment, in which rhs is not evaluated when the assignment is made, but is instead evaluated each time the value of lhs is requested.”

(* Pierwszy przykład, gdzie jasno widać różnicę  *)

f[x_]:=x^5/(1+x^4)

f[x]

f1[x_]:=D[f[x],x]

f1[x]

f1[3]

f2[x_]=D[f[x],x]

f2[3]

(* Drugi przykład, gdzie widać drastyczną różnicę w czasie działania obu typów funkcji; definicja g1[x] nie używa końcowego wyniku całki, ale za każdym wywołaniem funkcji powtarza liczenie całki ! *)

Simplify[Integrate[Exp[-a*x],{x,0,Infinity}],a>0]

g1[a_]:=Simplify[Integrate[Exp[-a*x],{x,0,Infinity}],a>0];

g2[a_]   =Simplify[Integrate[Exp[-a*x],{x,0,Infinity}],a>0];

D[g1[x],x] (* tu dostajemy nieprawidłowy wynik ! *)

D[g1[xx],xx]

D[g2[x],x]

Timing[Do[res=g1[5];,{i,1,1000}]]

Timing[Do[res=g2[5];,{i,1,1000}]]

(* Trzeci przykład, chyba najbardziej czytelny z wykorzystaniem "Now" ! *)

Now

t1=Now;

t2:=Now;

t1

(* Ta instrukcja (sumowanie pierwszych stu wyrazów ciągu (Subscript[a, n])= (((n^2) )/(Sqrt[n+1]))) wykonywana jest tylko po to, by upłynął jakiś czas pomiędzy wywołaniami t1 *)

s=Sum[n^2/Sqrt[n+1],{n,1,100}];

t1

(* t1 ma wciąż tę samą wartość. Teraz sprawdźmy t2: *)

t2

(* t2 ma wartość inną niż t1 ... *)

s=Sum[n^2/Sqrt[n+1],{n,1,100}];

t2

(* Wartość t2 jest obliczana ZA KAŻDYM RAZEM, gdy wywołujemy t2 *)