Problémy s vyhodnocováním - při prvním čtení lze vynechat

Nechť proměnné a, b nemají hodnotu:

> a:='a'; b:='b';

a := 'a'

b := 'b'

Pak přiřazení

> interval:=a..b; delka:=b-a;

interval := a .. b

delka := b-a

... bude automaticky respektovat hodnoty, kterých proměnné a, b později nabydou:

> a:=1; b:=10;

a := 1

b := 10

> interval; delka;

1 .. 10

9

Některé složitější datové stuktury, např. funkce a pole, se automaticky plně nevyhodnocují.

> h:= x -> arctan(x^2);

> a:=array(identity, 1..2,1..2);

h := proc (x) options operator, arrow; arctan(x^2) ...

a := array(identity,1 .. 2,1 .. 2,[])

Při výstupu se zobrazí pouze jejich jméno, nikoli obsah:

> h, a;

h, a

Víc se o nich dovíme po vyhodnocení funkcí eval :

> eval(h); eval(a);

proc (x) options operator, arrow; arctan(x^2) end p...

matrix([[1, 0], [0, 1]])

Funkci `eval` potřebujeme také tehdy, chceme-li vytvořit kopie těchto struktur:

> totez:=h;

> kopie:=eval(h);

totez := h

kopie := proc (x) options operator, arrow; arctan(x...

Na první pohled se zdají být funkce `totez`, `kopie` stejné:

> eval(totez);

> eval(kopie);

proc (x) options operator, arrow; arctan(x^2) end p...

proc (x) options operator, arrow; arctan(x^2) end p...

... ale `kopie` je (nezávislá) kopie, zatímco `totez` je identická s funkcí h.

To se projeví, předefinujeme-li h - `totez` se změní, `kopie` nikoli:

> h:=sin;

h := sin

> eval(totez);

proc (x::algebraic) local n, t, pull_out, keep_in; ...

> eval(kopie);

proc (x) options operator, arrow; arctan(x^2) end p...

> totez(2);

sin(2)

> kopie(2);

arctan(4)