ПАСКАЛЬ: точка повернення, підстановка аргументів, зберігання змінних
x := x + 1; f := x
end;
function g (var x : integer ) : integer;
begin x := x div 2; g := x end;
begin a := 12; b := f ( g ( a ) ) end.
відобразимо такою таблицею:
Що виконуєтьсяСтан пам'яті
a b
a := 1212 ?
починається b := f(g(12))12 ?
виклик f(g(12))12 ?f. x f. f ТП
12 ?? ? b:=
починається f. x := g(12)12 ?? ? b:=
виклик g(12)g. x ?? ? b:=g. g ТП
g. x := 1212 ?? ? b:=? f. x:=
g. x := g. X div 26 ?? ? b:=? f. x:=
g. g := g. X6 ?? ? b:=6 f. x:=
повернення з g6 ?? ? b:=6 f. x:=
закінчення f. x := g(12)6 ?6 ? b:=
f. x := f. x + 16 ?7 ? b:=
f. f := f. X6 ?7 7 b:=
повернення з f6 ?7 7 b:=
закінчення b := f(g(12))6 7
Як видно з таблиці, перед виконанням виклику f(g(a)) у локальній пам'яті функції f запам'ятовується точка повернення – присвоювання b:=f(g(a)). Виконання виклику f(g(a)) починається обчисленням значення аргументу, відповідного її параметру x – виразу g(a). При цьому запам'ятовується точка повернення – присвоювання f.x:=g(a) – і починається виконання виклику функції g з аргументом a. Цей аргумент підставляється за посиланням, і зміна g.x є зміною a. З виклику функції g повертається значення 6 і присвоюється параметру f.x. Пам'ять функції g звільняється. Тільки тепер починається виконання операторів функції f. У результаті в програму повертається значення 7 і присвоюється змінній b. Пам'ять функції f звільняється.