Here are my gripes with `let` and `const` returning values:

1) declaration lists are hard to read:

    if ((let x = 10, y = 20) > 15) {
        // true, but what's being compared here? 10 or 20? (answer: 20)
    }

Although right now this is allowed and the last element is compared:

    if ((x = 10, y = 20) > 15) {
        // result is true, 20 > 15
    }

2) Destructuring assignments are also confusing, what's being compared here?

    if(let [x,y] = [1,2]) {
    }

Again, this is allowed as of today:

    if([x,y] = [1,2]) {
        // true, as it returns [1,2]
    }

3) Nesting `let/const` would be either expected everywhere (not only
in the `if`) or a possible side effect from the implementation.
Similar to languages such as Perl.

    let x = foo(let y = 100, z = 200);  // what's the scope of x and z?

This leads to hard to read and very confusing code golf.

That's why Golang went with something simple,
`if([declaration];[conditional])`, and avoided confusion over `:=`
assignments returning values anywhere in the code. `x:=( y:= 20 )` is
not allowed in Go.

It expands on the 45-year tried-and-true structure of `for(;;)` to
create `if(;)` and keep the ES language simple and clear expanding on
its own concept of `for(;;)`.

On Wed, Mar 21, 2018 at 7:57 AM, Naveen Chawla <naveen.c...@gmail.com> wrote:
> OK I neglected to read the original post fully. My last post example would
> be based on allowing `const` and `let` declarations to expressions in of
> themselves (in the case of multi variables, returning the last one). So let
> me ask, what exactly would be the problem with this?
>
> On Wed, 21 Mar 2018 at 12:20 Naveen Chawla <naveen.c...@gmail.com> wrote:
>>
>> What would `if.value` look like in an example?
>>
>> Wouldn't it be possible to have something like `if(const x = getX() &&
>> const y = getY())` to capture more than just the conditional if required?
>> I'm guessing that would probably break something somewhere, but I'm not sure
>> what.
>>
>> On Wed, 21 Mar 2018 at 04:35 Jordan Harband <ljh...@gmail.com> wrote:
>>>
>>> Is the use case only ever to capture the thing that serves as the
>>> conditional?
>>>
>>> If so, would perhaps something like `if.value` work better? Since it's a
>>> keyword, it could be made to only work in the `if` block, and you wouldn't
>>> need any of that odd multi-statement stuff in the conditional parens.
>>>
>>> On Tue, Mar 20, 2018 at 12:57 PM, Rodrigo <rodrigol...@gmail.com> wrote:
>>>>
>>>> Proposal: inline let/const statements to declare and initialize
>>>> variables within if statements, so that temporary variables exist only
>>>> within the if/else block scope.
>>>>
>>>> Reason: limits variable scope to the block where really needed, in
>>>> similar fashion to variables defined in for(;;) statements. This
>>>> improves readability while reducing unnecessary variables roaming
>>>> outside their needed block.
>>>>
>>>> The syntax would be very similar to the for(;;) assignment/test pair:
>>>>
>>>>     if (let x = 100; x > 50) {
>>>>         console.log(x); // 100
>>>>     }
>>>>     console.log(x); // ReferenceError
>>>>
>>>>     // same for const
>>>>     if( const x = foo(); typeof x === 'object' ) {
>>>>         //...
>>>>     }
>>>>
>>>>     // the variable is available within any else block
>>>>     // after its declaration
>>>>     if (let x = foo(); x < 50) {
>>>>         console.log(x);  // y is not available here
>>>>     } else if (let y = bar(); y > 0) {
>>>>         console.log(x, y);
>>>>     } else {
>>>>         console.log(x, y);
>>>>     }
>>>>
>>>> Right now there isn't a way to limit a variable to the if block:
>>>>
>>>>     let x = 100;
>>>>     if (x > 50) {
>>>>         console.log(x);
>>>>     }
>>>>     // x is in scope, but may not be needed beyond the if statement
>>>>     console.log(x);
>>>>
>>>>     // or a non-strict assignment, which also "leaks" scope
>>>>     if( (x = 100) > 50 ) {
>>>>         // ...
>>>>     }
>>>>
>>>> There are many "workarounds" available, here's a few:
>>>>
>>>>     // workaround 1: can be remedied with a scope block
>>>>     // but it's asymmetrical and non-idiomatic
>>>>     {
>>>>         let x = 100;
>>>>         if (x > 50) {
>>>>             console.log(x);
>>>>         }
>>>>     }
>>>>
>>>>     // workaround 2: with a for statement
>>>>     // but this is non-idiomatic, hard to read and error-prone
>>>>     for (let x = 100; x > 50;) {
>>>>         console.log(x);
>>>>         break;
>>>>     }
>>>>
>>>> If-initialization is available in many languages (Go, Perl and Ruby
>>>> come to mind) and are considered best practice in each one of them:
>>>>
>>>>     // Golang - x is defined, assigned and conditionally tested
>>>>     if x := 100; x > 50 {
>>>>         // x is in scope here
>>>>     } else {
>>>>         // and in here
>>>>     }
>>>>     // x is not available here
>>>>
>>>>     ###### Perl
>>>>     if( my $x = 100 ) {
>>>>         print $x;
>>>>     }
>>>>     print $x; # an error
>>>>
>>>>     if ( ( my $x = myfoo() ) > 50 ) {  # also ok in Perl
>>>>         print $x;
>>>>     }
>>>>
>>>>     ###### Ruby
>>>>     if ( x = 100 )  # parens required per style guide
>>>>         puts(x)
>>>>     end
>>>>     puts(x) # unfortunately Ruby does not limit scope to if, so x
>>>> "leaks"
>>>>
>>>> I think this would be a great and important addition to the language.
>>>>
>>>> -Rodrigo
>>>>
>>>> PS: Just for the sake of comparison, Perl-style if-assignments could
>>>> also be an
>>>> option, albeit a very bad one IMO:
>>>>
>>>>     if( ( let x = 100 ) > 50 ) {
>>>>     }
>>>>
>>>> A Perl-style, value-returning let/const has readability issues, opens
>>>> quite a few fronts and sort of implies that let/const can return
>>>> values anywhere in the code outside if/else. On the other hand it
>>>> would fit with the currently if assignment if( x = y ). Definitely not
>>>> recommended.
>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> es-discuss@mozilla.org
>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>
>>>
>>> _______________________________________________
>>> es-discuss mailing list
>>> es-discuss@mozilla.org
>>> https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to