<div dir="ltr">const x = (tmp=>tmp*tmp+1)(f());<div><br></div><div>I've not seen a use case for do-expressions that can't already be done more elegantly. The proposal page certainly doesn't provide it, except for an opinion about how nested ternaries are "awkward". I've never found nested ternaries awkward, especially with good indentation:</div><div><br></div><div>question1 ?</div><div>    answer1 :</div><div>    question2 ?</div><div>        answer2 :</div><div>        answer3</div><div><div><div>         </div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, 18 Jan 2018 at 14:25 T.J. Crowder <<a href="mailto:tj.crowder@farsightsoftware.com">tj.crowder@farsightsoftware.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>On Thu, Jan 18, 2018 at 8:23 AM, Naveen Chawla <<a href="mailto:naveen.chwl@gmail.com" target="_blank">naveen.chwl@gmail.com</a>> wrote:</div><div>></div><div>> Also, I don't find it very readable/clear when reading it in code.</div><div>> Maybe I'm missing the whole point, but the comma operator forces</div><div>> you to wrap each non-expression language construct (e.g. for</div><div>> loops) into a function, which makes the expression itself clearer</div><div>> (in my opinion) than a do-expression.</div><div><br></div></div><div dir="ltr"><div>I believe the point is to allow a series of statements, not just an expression as with the comma operator; and (when a block is used with them) to provide a local scope for identifiers (which again the comma operator doens't provide). Basically an arrow function without the call overhead and (tiny bit of) syntactic cruft. E.g.:</div><div><br></div><div>With the `do` operator:</div><div><br></div><div>```js</div><div>let x = do {</div><div>  let tmp = f();</div><div>  tmp * tmp + 1</div><div>};</div><div>```</div><div><br></div><div>without the `do` operator:</div><div><br></div><div>```js</div><div>let x = (() => {</div><div>  let tmp = f();</div><div>  return tmp * tmp + 1;</div><div>})();</div><div>```</div><div><br></div><div>or in that particular case:</div><div><br></div><div>```js</div><div>let x;</div><div>{</div><div>  let tmp = f();</div><div>  x = tmp * tmp + 1;</div><div>}</div><div>```</div><div><br></div><div>...but that wouldn't work if `x` were a `const` instead.</div><div><br></div><div>How would you address that with just the comma operator? You need a scope for `tmp` unless you want it bleeding into the outer scope.</div><div><br></div><div>I also have to say I find the comma operator *very* easy to misuse, leading to hard-to-read code. `do` would be clearer in those cases.</div></div><div dir="ltr"><div><br></div><div>> Also, it's very easy to accidentally add code after the last</div><div>> statement, breaking the code and hence causing bugs!</div><div><br></div></div><div dir="ltr"><div>Can you give an example of what you mean by that? Randomly adding code in the wrong place is going to cause bugs, yes. :-) I mean, just generally...</div><div><br></div><div>I'm on the fence about `do` expressions. Yes, they provide a handy micro environment for a short series of statements. But given standalone blocks and arrow functions (particularly inline ones that are easily optimized), is it really worth overloading `do` with another meaning and adding to the human and computer parsing overhead? And encouraging inline logic rather than breaking into smaller pieces? I'm a firm "maybe" for now. :-)</div></div><div dir="ltr"><div><br></div><div>-- T.J. Crowder</div></div></blockquote></div>