Evaluating a function call is straightforward. Assume that we are to
evaluate the function call abs(0.0 - 1.0) under some
environment ENV0, where the function abs is defined as
follows:
We first evaluate the argument of the call to
~1.0 under ENV0;
we then extend ENV0 to ENV1 with a binding between
x and
~1.0 and start to evaluate the body of
abs under
ENV1; we evaluate the test
x >= 0 to
~1.0 >= 0
and then to
false, which indicates that we take the
else-branch
~x to continue; we evaluate
~x to
~(~1.0) and then to
1.0; so the evaluation of the
function call
abs(0.0 - 1.0) returns
1.0.