[Rd] return (x+1) * 1000
Mateo Obregón
obregonm@teo @end|ng |rom gm@||@com
Fri Nov 20 23:58:12 CET 2020
I don't see how anything operating on the "result" of a return() call could be
legal. The special semantics of the return() call is that it does **not**
return control to the place it was called from, but rather to the location
where its surrounding function(){} was called from.
Mateo.
--
Mateo Obregón.
On Friday, 20 November 2020 22:52:58 GMT Duncan Murdoch wrote:
> On 20/11/2020 5:36 p.m., Mateo Obregón wrote:
> > I'm not thinking of complicated cases.
> >
> > This happened to me in a function that returns 10 minute slots
> >
> > slot <- function (seconds) {
> >
> > return (seconds %/% 600) * 600
> >
> > }
> >
> > Obviously I found the issue while debugging and corrected my code with
> > surrounding parenthesis, but I was surprised that the R parser did not
> > catch this syntactic error.
> >
> > This is especially poignant when we have to switch between languages like
> > python where the original line would produce the desired result.
>
> That's legal code, so the parser can't catch it, it needs to be caught
> by some lint-like thing that looks for bad usage. The package check
> code has lots of that kind of check (including this one, though not yet
> in released R). So if you put this in a package and run the --as-cran
> checks in R-devel, you'll be notified about it.
>
> The fact that Python is different is something that's always going to
> cause problems for people who are more familiar with Python. I don't
> know Python well enough to list all the gotchas, but I'm sure there are
> lots of them.
>
> Duncan Murdoch
>
> > Mateo.
> > --
> > Mateo Obregón.
> >
> > On Friday, 20 November 2020 21:58:29 GMT Gabriel Becker wrote:
> >> Hi all,
> >>
> >> I can confirm this occurs for me as well.
> >>
> >> The one thing that comes to mind is that there are certain larger
> >> expressions that contain calls to return which we absolutely don't want
> >> to
> >> be an error, e.g
> >>
> >> if(somestuff)
> >>
> >> return(TRUE)
> >>
> >> That said, the actual expression Mateo pointed out certainly does look
> >> like
> >> an error (it definitely isn't going to do what the developer intended).
> >>
> >> I haven't looked at the parser much, to be honest. I assume there is
> >> perhaps enough differentiation of if/else that return() could be allowed
> >> within that but not inside a larger expression without it?
> >>
> >> There would be things that are legal (though horrifying) now that would
> >> stop working though, such as:
> >>
> >> f = function(a) {
> >>
> >> ret = switch(a,
> >>
> >> "1"= return("haha got 1!"),
> >>
> >> "2" = "regular ole 2")
> >>
> >> ret
> >>
> >> }
> >>
> >>
> >> Whether it would be a problem or not that such insanity wouldn't work is
> >> less clear. Are there valid non-if embedded return() cases that are
> >> important to allow? If so (and if they're not differentiated by the
> >> parser,
> >> which I somewhat doubt switch is, for example, though I'm not certain),
> >> I'm
> >> skeptical we'd be able to do as he suggests.
> >>
> >> It does seem worth considering though. If it can't be a hard parse error
> >> but we agree many/most cases are problematic, perhaps adding detecting
> >> this
> >> to the static checks that R CMD CHECK performs is another way forward.
> >>
> >> Best,
> >> ~G
> >>
> >> On Fri, Nov 20, 2020 at 1:34 PM Mateo Obregón <obregonmateo using gmail.com>
> >>
> >> wrote:
> >>> Dear r-developers-
> >>>
> >>> After many years of using and coding in R and other languages, I came
> >>> across
> >>> something that I think should be flagged by the parser:
> >>>
> >>> bug <- function (x) {
> >>>
> >>> return (x + 1) * 1000
> >>>
> >>> }
> >>>
> >>>> bug(1)
> >>>
> >>> [1] 2
> >>>
> >>> The return() call is not like any other function call that returns a
> >>> value
> >>> to
> >>> the point where it was called from. I think this should
> >>> straightforwardly
> >>> be
> >>> handled in the parser by flagging it as a syntactic error.
> >>>
> >>> Thoughts?
> >>>
> >>> Mateo.
> >>> --
> >>> Mateo Obregón.
> >>>
> >>> ______________________________________________
> >>> R-devel using r-project.org mailing list
> >>> https://stat.ethz.ch/mailman/listinfo/r-devel
> >
> > ______________________________________________
> > R-devel using r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list