Yes, that it true. However, functional evaluation isn't lazy. It's the computation that is lazy.
Consider the case where you have a very large arrays a, b and c (let's say is contains a few hundred million elements each). You then evaluate the following in APL:
a+b+c
What interpreters such as GNU APL does is to first evaluate b+c, resulting in a new array, and then add that result to a.
In my case, b+c returns a deferred computation. This is then added to a which returns yet another deferred computation.
The actual values are not computed until I read the results out of the deferred computation. This means that there does not need to be a synchronisation point between the two addition operations.
There is also the benefit that if not all results from a computation are needed, they might not even have to be computed in the first place.
However, the functions themselves are still evaluated, meaning that side effects are called when you'd expected them to.
Well, there is an exception. Consider the following:
{print ⍵ ◊ ⍵+1}¨foo
This also returns a deferred result, and this will indeed result in print being called at an unexpected time. You can force evaluation in this case, but I haven't decided what to do about this case yet.