(Almost) everything is expression

François REMY fremycompany_pub at yahoo.fr
Fri Nov 11 02:44:25 PST 2011

I didn't read your first mail, I've to acknowledge. That doesn't change the 
fact the sample was reinventing the wheel.

BTW,your samples all suffer from a big ambuiguity that I think is 

    let a = if (foo) {
       print('a is foo');
    } else {
       // do some longer stuff

How do you know "foo" is an expression that should be assigned to "a" and 
that "print('a...')" is not?

In ECMAScript, each statement returns a value. There's no way to find out if 
the statement is a "normal" statement or a "value" statement. To my 
understanding, there's no.

    let a = try {
        if(test()) {
            translate("test was true")
        } else {
            translate("test was false")
    } catch(ex) {
        translate("test has raised an exception")

Secondly, is it worth modifying the UA's compilers and JS syntax? What's 
what you gain, in terms of readability, in terms of facility, ... ?

PS: I don't know what is the "do" syntax you reference but I guess it solves 
the ambiguity problem by creating a kind of "block lambda". Value statements 
can be recognized by a "return" statement inside the block.

    let a = do {
        if(test()) {
            return translate("...");
        } else {
            return translate("...");

In such case "do { ... }" is just a sugar for (function() { ...})(). It 
could be used to make more beautiful the "module" pattern used in many codes 

-----Message d'origine----- 
From: Dmitry Soshnikov
Sent: Friday, November 11, 2011 10:42 AM
To: François REMY
Cc: David Herman ; es-discuss Steen
Subject: Re: (Almost) everything is expression

On 11.11.2011 13:26, François REMY wrote:
> <aside note>
>    let x = q ? 10 : 20;
>    Why we're reinventing the wheel here is up to me.
> </aside>

I noted it in the initial letter. Yes, we have the sugar for this
particular case for years (the ternary operator). But also with this I
mention that it doesn't allow _conveniently_ handle complex bodies of
consequent and alternative nodes of an if-expression. Please re-read my
initial letter.

Once again, the idea is to have _in addition_ for all the statement
parts the same expression parts (not only for if-statement, so sorry, I
don't buy your "reinventing the wheel").

And since this is exactly the _addition_, but _not the replacement_,
it's still possible to use statement forms (w/o explicit semicolon). But
if you need an expression form, use it. The same as with FD and FE.


> -----Message d'origine----- From: Dmitry Soshnikov
> Sent: Friday, November 11, 2011 8:54 AM
> To: David Herman
> Cc: es-discuss Steen
> Subject: Re: (Almost) everything is expression
> On 11.11.2011 11:43, David Herman wrote:
>>> Brendan and Dave mention explicit semicolon. Yes, it's seems so by the 
>>> grammar (though, have to check more precisely), but it can be acceptable 
>>> price.
>> It's a serious price, though. Today if I write:
>>      if (q) { ... }
>>      else { ... }
>>      (f())
>> then ASI kicks in after the else body. If we make if-statements into 
>> expressions, then either the above becomes a single expression, which is 
>> a serious and subtle backwards-incompatible change, or we define 
>> lookahead restrictions on ExpressionStatement, and introduce a 
>> refactoring hazard:
>>      x = if (q) { ... }
>>          else { ... }
>>      (f())                 // oops, this is now a parameter list on the 
>> RHS of the assignment!
>> I'm not positive, but that seems like a serious issue to me.
> Yes, all this relatively true, but personally I don't see the big issue.
> In practice we already have such a case e.g. for FD (function
> declaration) vs. FE (function expression).
> The former doesn't require semicolon, the later does. Though, in the
> later case (FE), today most of programmers put explicit semicolon to
> avoid problems with scripts minimizing. From this viewpoint it's not a
> big price, since even now the programmers are already used to such cases.
> Regarding old code it's also not the issue since there is no such old
> code, it's a syntax error. And even if a user will refactor code (to
> make it look shorter and elegantly), she should be aware about this case
> (again -- just like with FD and FE -- users are aware about it):
> Was:
> var x;
> if (q) {
>   x = 10;
> } else {
>   x = 20;
> }
> Becomes:
> let x = if (q) {
>   10;
> } else {
>   20;
> };
>>> Nope, have to think more on this...
>> You might want to take a look at this:
>> http://wiki.ecmascript.org/doku.php?id=strawman:block_vs_object_literal
> Yep, I've seen it before briefly; will check it more precisely later,
> thanks.
> Dmitry.
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss 

More information about the es-discuss mailing list