From murdoch@dunc@n @end|ng |rom gm@||@com  Fri Aug 16 22:31:15 2019
From: murdoch@dunc@n @end|ng |rom gm@||@com (Duncan Murdoch)
Date: Fri, 16 Aug 2019 16:31:15 -0400
Subject: [Rd] Documenting else's greed
In-Reply-To: <CAJmOi+O-3gUjdEmFJQhTfNxwUzQ86snSti_6yt26zJRDjgX7Ug@mail.gmail.com>
References: <CAJmOi+O-3gUjdEmFJQhTfNxwUzQ86snSti_6yt26zJRDjgX7Ug@mail.gmail.com>
Message-ID: <d0ead42a-24da-8bb6-b924-3f799efa04ac@gmail.com>

On 16/08/2019 12:36 p.m., Hugh Parsonage wrote:
> I was initially pretty shocked by the result in this question:
> https://stackoverflow.com/questions/57527434/when-do-i-need-parentheses-around-an-if-statement-to-control-the-sequence-of-a-f
> 
> Briefly, the following returns 0, not 3 as might be expected:
> 
> if (TRUE) {
>      0
> } else {
>      2
> } + 3
> 
> At first I thought it the question was simply one of syntax
> precedence, but I believe the result is too surprising to not warrant
> note in the documentation of Control. I believe the documentation
> should highlight that the `alt.expr` is demarcated by a semicolon or
> newline and the end of a *statement*, not a closing brace per se.
> 
> Perhaps in the paragraph starting 'Note that it is a common mistake to
> forget to put braces...' it should end with. "Note too that it is the
> end of a *statement*, not a closing brace per se, that determines
> where `alt.expr` ends. Thus if (cond) {0} else {2} + 2 means if (cond)
> {0} else {2 + 2} not {if (cond) {0} else {2}} + 2."



I agree this is surprising, and should perhaps be pointed out in the 
docs, but I don't think your suggestion is quite right.  { 2 } + 3 is a 
legal expression.  It doesn't have to be the end of a statement that 
limits the alt.expr, e.g. this could be one big statement:


  { if (TRUE) {
       0
     } else {
       2
     } + 3 }

What ends alt.expr is a token that isn't collected as part of alt.expr, 
not just a semicolon (which separates statements) or a newline.  I don't 
know how many of those there are, but the list would include at least
semicolon, newline, }, ), ], and maybe others.

Duncan Murdoch



[Rd] Documenting else's greed
Duncan Murdoch