From tomas.kalibera at gmail.com  Wed Aug 23 10:07:27 2017
From: tomas.kalibera at gmail.com (Tomas Kalibera)
Date: Wed, 23 Aug 2017 10:07:27 +0200
Subject: [Rd] Possible repeat{} / break function bug in R 3.4.1
In-Reply-To: <2200F45E-9C76-44CB-B1F4-FD13ECC50E4C@rstudio.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>
 <2200F45E-9C76-44CB-B1F4-FD13ECC50E4C@rstudio.com>
Message-ID: <e1953a9d-90ab-783b-e902-6fde81bc60af@gmail.com>


return can be used to set the return value of an expression evaluated by 
"eval"

expr <- quote(if (x) return(1) else return(2))
x <- FALSE
eval(expr) #2

Tomas

On 08/23/2017 09:46 AM, Lionel Henry wrote:
> 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
Tomas Kalibera