Lambda vs. function

Dave Herman dherman at
Fri Oct 17 16:40:33 PDT 2008

No, I must have misunderstood what you meant by "wrapping the call to  
g() inside another statement" -- I thought you were referring to  
wrapping it in a context such as

     { -- ; stmt; }

which would obviously not be a tail position. But this:

> lambda f(x) {
> if (x == 0)
>  1;
> else
>  f(x - 1);
> }

would be tail recursive. Let's try to get specific without drowning in  
too much detail. Here is a taste of what defines tail position,  
written in the style of an attribute grammar:


Expression <- lambda Formals Block
     Block.tail = true

Statement <- { stmt1; ... ; stmtn; stmt; }

     stmt1.tail = false
     stmtn.tail = false
     stmt.tail = Statement.tail

Statement <- if expr stmt;

     expr.tail = false
     stmt.tail = Statement.tail

Statement <- if expr stmt1 else stmt2;

     expr.tail = false
     stmt1.tail = Statement.tail
     stmt2.tail = Statement.tail

Statement <- while (expr) stmt

     expr.tail = false
     stmt.tail = false


Do you see where I'm going with this? It's a pretty natural idea. The  
branches of an if-statement can be in tail position because they are  
the last thing produced by the if-statement. Some things like loop  
forms and switch won't be able to contain tail positions because  
they're too imperative. But if statements and blocks have a very  
natural notion of tail position.


More information about the Es-discuss mailing list