[Sorry for my absence lately.]

If yield does work, then we're capturing deep stacks. A more plausible example:

function j(x) {
 (lambda (y) {
    (lambda (z) {
       yield z;
     }
     (y + " and a dyne"));
  }
  (x + ", a poundal"));
}
print(j("I love you").next());

This is just a desugaring of some nested lets, but we still have yield capturing many frames. If this doesn't work, lambda is really useless.

This issue really comes down to whether `lambda' is properly tail calling. If so, then the `yield' in this example occurs as if it were directly within the body of `j', because there's no stack beyond the activation frame of `j'.

To be a little more precise: when people refer to "Tennent," the main property they're talking about is that (modulo syntax) an expression E is equivalent to the expression (lambda () E)(). Namely, in any expression context (roughly, a position in a program where you can place an expression), either expression will result in the same program behavior.

If we don't want generators to capture deep stacks, then we can make it a dynamic error for `yield' to occur in a non-empty sub-stack. Then in order to preserve the property that (lambda () E)() for all E, we'd have to mandate that (lambda () E)() is really a tail call and guaranteed not to push any stack.

Alternatively, we could allow generators to capture deep lambda- stacks, but not deep function-stacks. However...

For what it's worth, speaking as a long-time Scheme fan, I wouldn't add lambda to ES. It seems too similar to function; there will be endless blog posts explaining the differences and motivation, mostly slightly wrong. The best ones will say, "Don't use it; just use function." And lambda introduces an awful lot of subtlety for something whose main claim to utility would be in allowing precise and clear definitions of new control constructs through desugaring. Natural language is bad, but not this bad.

I hear you. I love lambda, I love the syntactic simplicity of Smalltalk blocks (and we could probably approximate its syntactic simplicity with a literal syntax), and I love the idea of adding a properly tail-calling function form. Nevertheless, I recognize that the similarity to `function' is a usability hazard.

Dave

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to