
On 3 Oct 2007, at 1:42 pm, PR Stanley wrote:
When a function is declared in C the argument variable has an address somewhere in the memory: int f ( int x ) { return x * x; }
Wrong. On the machines I use, x will be passed in registers and will never ever have an address in memory. In fact, unless I hold the Sun C compiler back by main force, it will probably open code f() so that there isn't any f any more, let alone any x. Here's the actual SPARC code generated for f: f: retl mulx %o0,%o0,%o0 No memory, no address. In C, a function call is rather like entering a new block, declaring some new variables (which might or might not ever go into memory) and initialising them to the values of the arguments. In Haskell, carrying out a function call is rather like creating some new names and *binding* them to promises to evaluate the arguments (if they are ever needed) and then returning a promise to evaluate the body (if it is ever needed). The key point is *binding* names to (deferred calculations of) values, rather than *initialising* mutable variables to (fully evaluated) values. How this is done is entirely up to the compiler.