From lionel at rstudio.com  Wed Aug 23 09:46:34 2017
From: lionel at rstudio.com (Lionel Henry)
Date: Wed, 23 Aug 2017 09:46:34 +0200
Subject: [Rd] Possible repeat{} / break function bug in R 3.4.1
In-Reply-To: <ba631996-db0b-12d1-e149-c14e6a20f802@gmail.com>
References: <1f22e392cb594b52ac3907d9f79992dd@MEX2.metro-region.org>
 <22941.10844.382587.277767@stat.math.ethz.ch>
 <22941.11268.787310.511504@stat.math.ethz.ch>
 <60DC6C3E-1BF9-4F20-8A99-20D4C129755D@rstudio.com>
 <ba631996-db0b-12d1-e149-c14e6a20f802@gmail.com>
Message-ID: <2200F45E-9C76-44CB-B1F4-FD13ECC50E4C@rstudio.com>

oops, I should have tried it:

    expr <- quote(break)
    repeat(eval(expr))


So eval() has hybrid semantics where `break` has more reach than
return(), weird.

    expr <- quote(return())
    repeat(eval(expr))  # infloop

Lionel


> On 23 ao?t 2017, at 09:24, Tomas Kalibera <tomas.kalibera at gmail.com> wrote:
> 
> It is a bug in the byte-code compiler. I will fix
> Tomas
> 
> On 08/23/2017 09:22 AM, Lionel Henry wrote:
>> I don't think that's a bug. source() uses eval(), and eval() creates a
>> new function-like context frame. In a way expecting `break` to work
>> inside source() is like expecting `break` to cross stack frames:
>> 
>>     my_break <- function() break
>>     repeat(my_break())
>> 
>> Lionel
>> 
>> 
>>> On 23 ao?t 2017, at 09:17, Martin Maechler <maechler at stat.math.ethz.ch> wrote:
>>> 
>>>>>>>> Martin Maechler <maechler at stat.math.ethz.ch>
>>>>>>>>    on Wed, 23 Aug 2017 09:10:20 +0200 writes:
>>>>>>>> Peter Bosa <Peter.Bosa at oregonmetro.gov>
>>>>>>>>    on Tue, 22 Aug 2017 14:39:50 +0000 writes:
>>>>> Hello, I've noticed the following error using repeat{} / break in R 3.4.1 running on Windows 10 and Windows Server 2008 (both 64-bit environments).
>>>>> When running a repeat function, the break command causes an error message if the repeat command refers to code within a file, but does not produce an error if the code is contained within the repeat{} command.
>>>>> Hello, I've noticed the following error using repeat{} / break in R 3.4.1 running on Windows 10 and Windows Server 2008 (both 64-bit environments).
>>>>> 
>>>>> When running a repeat function, the break command causes an error message if the repeat command refers to code within a file, but does not produce an error if the code is contained within the repeat{} command.
>>>>> 
>>>>> For example, the following code runs fine:
>>>>> 
>>>>> x <- 1
>>>>> y <- 5
>>>>> 
>>>>> repeat {
>>>>> if(x < y) {
>>>>> print("No Break Dance :-(")
>>>>> x = x + 1
>>>>> } else {
>>>>> print("Break Dance!")
>>>>> break
>>>>> }
>>>>> }
>>>>> 
>>>>> [1] "No Break Dance :("
>>>>> [1] "No Break Dance :("
>>>>> [1] "No Break Dance :("
>>>>> [1] "No Break Dance :("
>>>>> [1] "No Break Dance :("
>>>>> [1] "Break Dance!"
>>>>> However, if I take the loop contents of the repeat{} function, and save them to a file (breakTest.R) that contains the following:
>>>>> 
>>>>> if(x < y) {
>>>>> print("No Break Dance :-(")
>>>>> x = x + 1
>>>>> } else {
>>>>> print("Break Dance!")
>>>>> break
>>>>> }
>>>>> 
>>>>> And then run the following code:
>>>>> 
>>>>> x <- 1
>>>>> y <- 5
>>>>> 
>>>>> repeat{
>>>>> source("./breakTest.R")
>>>>> }
>>>>> 
>>>>> I get the following error:
>>>>> 
>>>>> [1] "No Break Dance :("
>>>>> [1] "No Break Dance :("
>>>>> [1] "No Break Dance :("
>>>>> [1] "No Break Dance :("
>>>>> [1] "No Break Dance :("
>>>>> [1] "Break Dance!"
>>>>> Error in eval(ei, envir) : no loop for break/next, jumping to top level
>>>>> This was not an issue with previous versions of R that I have used, including 3.3.3.
>>>>> 
>>>>> Any suggestions? Is this a known bug with 3.4.1?
>>>> Thank you, Peter!
>>>> I can confirm what you are seeing (on Linux) in R version 3.4.0,
>>>> 3.4.1, and "R devel", and also that this had worked w/o a
>>>> problem in earlier versions of R, where I've looked at
>>>> R version 3.3.3 and 3.2.5.
>>>> I do think this is a bug, but it was not known till now.
>>>> For ease of use, I attach the two R files to easily reproduce.
>>>> Note I use  writeLines() instead of print() as its output is "nicer".
>>>> Best regards,
>>>> Martin Maechler, ETH Zurich
>>> Trying again with the two attachment.  Yes, I of all people (!!)
>>> should know that they must have an allowed MIME type; in this
>>> case  text/plain !
>>> 
>>> Martin
>>> 
>>> ## see ./break-source_R341.R
>>> if(x < y) {
>>>  writeLines("No Break Dance :-(")
>>>  x <- x + 1
>>> } else {
>>>  writeLines("Break Dance!")
>>>  break
>>> }
>>> ## From: Peter Bosa <Peter.Bosa at oregonmetro.gov>
>>> ## To: "R-devel at r-project.org" <R-devel at r-project.org>
>>> ## Subject: [Rd] Possible repeat{} / break function bug in R 3.4.1
>>> ## Date: Tue, 22 Aug 2017 14:39:50 +0000
>>> 
>>> ## Hello, I've noticed the following error using repeat{} / break in R 3.4.1 running on Windows 10 and Windows Server 2008 (both 64-bit environments).
>>> 
>>> ## When running a repeat function, the break command causes an error message if the repeat command refers to code within a file, but does not produce an error if the code is contained within the repeat{} command.
>>> 
>>> ## For example, the following code runs fine:
>>> 
>>> x <- 1
>>> y <- 5
>>> repeat {
>>>  if(x < y) {
>>>    writeLines("No Break Dance :-(")
>>>    x <- x + 1
>>>  } else {
>>>    writeLines("Break Dance!")
>>>    break
>>>  }
>>> }
>>> ## No Break Dance :(
>>> ## No Break Dance :(
>>> ## No Break Dance :(
>>> ## No Break Dance :(
>>> ## No Break Dance :(
>>> ## Break Dance!
>>> ## >
>>> 
>>> ## However, if I take the loop contents of the repeat{} function, and save
>>> ## them to a file (breakTest.R) that contains the following:
>>> ##                 ^^^^^^^^^^^
>>> ##                __SEE THAT FILE__
>>> ## if(x < y) {
>>> ##   writeLines("No Break Dance :-(")
>>> ##   x = x + 1
>>> ## } else {
>>> ##   writeLines("Break Dance!")
>>> ##   break
>>> ## }
>>> 
>>> ## And then run the following code:
>>> 
>>> x <- 1
>>> y <- 5
>>> repeat{
>>>  source("./breakTest.R")
>>> }
>>> cat("successfully finished\n")
>>> 
>>> ## I get the following error:
>>> 
>>> ## No Break Dance :(
>>> ## No Break Dance :(
>>> ## No Break Dance :(
>>> ## No Break Dance :(
>>> ## No Break Dance :(
>>> ## Break Dance!
>>> ## Error in eval(ei, envir) : no loop for break/next, jumping to top level
>>> ## ^^^^^^^^^^^^^^^^^^^^
>>> 
>>> 
>>> ## This was not an issue with previous versions of R that I have used, including 3.3.3.
>>> 
>>> ## MM: It does work in R 3.3.3, indeed
>>> ## --  it fails in R 3.4.0 and later
>>> 
>>> 
>>> ## Any suggestions? Is this a known bug with 3.4.1?
>>> 
>>> ## Cheers-
>>> ## Peter
>>> 
>>> 
>>> ## ----------------------------------------------------------------
>>> ## peter bosa
>>> ## metro
>>> ## modeling services
>>> ## 600 ne grand ave
>>> ## portland, or  97232
>>> 
>>> ## peter.bosa at oregonmetro.gov<mailto:peter.bosa at oregonmetro.gov>
>>> ## 503.797.1771
>>> 
>>> ## metro | making a great place
>>> ## www.oregonmetro.gov
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 



[Rd] Possible repeat{} / break function bug in R 3.4.1
Lionel Henry