let* is the new var

# Jon Zeppieri (18 years ago)

Was let*, possibly under some other name, ever discussed/proposed? For let definitions, I think the following is supposed to work:

{ let x = n; let y = foo(x); ... }

That is, x and y should be bound sequentially, not in parallel, right? (An example at proposals:block_expressions strongly suggests this, anyway.) Doesn't work in the RI, but I assume this is a bug.

However, there's no good way to do this for let expressions. (Having to nest the expressions leads to cluttered code.) Also, since the motto for let was "let is the new var," it should be mentioned that var binds left-to-right.

# Dave Herman (17 years ago)

Was let*, possibly under some other name, ever discussed/proposed? For let definitions, I think the following is supposed to work:

{ let x = n; let y = foo(x); ... }

That is, x and y should be bound sequentially, not in parallel, right?

Neither, actually -- for let declarations. In your example, both x and y are bound in the entire block -- this is hoisting just like `var', except it's only hoisted to the top of the block instead of the function. This might sound surprising, but this means that it's letrec rather than let*.

For let expressions and let statements, though, I agree with you. I think we ought to have let* semantics, and as you say I think the RI currently implements let semantics.

# Jon Zeppieri (17 years ago)

On Tue, Mar 25, 2008 at 6:17 PM, Dave Herman <dherman at ccs.neu.edu> wrote:

Neither, actually -- for let declarations. In your example, both x and y are bound in the entire block -- this is hoisting just like `var', except it's only hoisted to the top of the block instead of the function. This might sound surprising, but this means that it's letrec rather than let*.

Is it actually letrec, or is it letrec*? The example I referred to (from the proposal page) would require letrec* semantics:

=== if (x > y) { let const k = 37; let gamma : int = 12.7 + k; let i = 10; let function f(n) { return (n/3)+k; } return f(gamma) + f(i); }

For let expressions and let statements, though, I agree with you. I think we ought to have let* semantics, and as you say I think the RI currently implements let semantics.

It's not just the RI; the official proposal is very specific about let semantics.

# Dave Herman (17 years ago)

Is it actually letrec, or is it letrec*? The example I referred to (from the proposal page) would require letrec* semantics:

Let's not go too far with the Scheme analogies, since we're not talking about Scheme. :) The idea is just like var-hoisting, only the hoisting goes to the top of the nearest block, not the nearest function. Just like var-hoisting, the initializer expressions are just assignments that happen exactly where you wrote them. So indeed, like letrec*, the initializers are evaluated in order from top to bottom.

It's not just the RI; the official proposal is very specific about let semantics.

This is a detail that we should stamp out, I agree. I'll look for a trac ticket and file one if there isn't one.

# Dave Herman (17 years ago)

Created as ticket #375:

bugs.ecmascript.org/ticket/375

# P T Withington (17 years ago)

This conversation makes me ask, what is the semantics of var in a
class declaration? E.g.:

class ... { function foo ... var fooAlias = foo;

var bar = 42; var bletch = bar + 1;

etc.

Same rules? All slots created at the top of the block and
initializations executed in order? I'm particularly interested in the
case of creating an alias to a function.

# Lars Hansen (17 years ago)

Don't remember this ever coming up; I always assumed it would be like for ES3 code (scopes of names are the entire block; functions are initialized first; then variables in order).

# Jeff Dyer (17 years ago)

Let's use 866 7052554, 6608431. dialing now...

# Jeff Dyer (17 years ago)

Oops. Never mind :)

Jd

-----Original Message----- From: es4-discuss-bounces at mozilla.org [mailto:es4-discuss- bounces at mozilla.org] On Behalf Of Jeff Dyer Sent: Wednesday, April 02, 2008 3:06 PM To: Lars Hansen; P T Withington; Dave Herman Cc: es4-discuss Discuss; Jon Zeppieri Subject: RE: let* is the new var

Let's use 866 7052554, 6608431. dialing now...

-----Original Message----- From: es4-discuss-bounces at mozilla.org [mailto:es4-discuss- bounces at mozilla.org] On Behalf Of Lars Hansen Sent: Wednesday, April 02, 2008 2:49 PM To: P T Withington; Dave Herman Cc: es4-discuss Discuss; Jon Zeppieri Subject: RE: let* is the new var

Don't remember this ever coming up; I always assumed it would be

like

for ES3 code (scopes of names are the entire block; functions are initialized first; then variables in order).

--lars

-----Original Message----- From: es4-discuss-bounces at mozilla.org [mailto:es4-discuss-bounces at mozilla.org] On Behalf Of P T

Withington

# Michael O'Brien (17 years ago)

We define the slots for vars and functions first at the top of the block and do initializations in-order where they reside in the code flow. So:

class XX { function foo ...

//	fooAlias exists here but is undefined
var fooAlias = foo

//	fooAlias is now initialized

}

Michael