Hi,
On 03/07/2016 09:26 AM, Martin Maechler wrote:
I'm proposing to signal an error (from R >= 3.3.0) in such
examples -- which do "work" in R 3.2.x and earlier :
f <- NULL; body(f) <- quote(sin(a+1)); f
function ()
sin(a + 1)
<environment: 0x48f9798>
This works because formals() (the getter) works on things that are
not a function.
g <- NULL; formals(g) <- alist(x = pi, y=); g
function (x = pi, y)
NULL
<environment: 0x4e6dfe8>
And this works because body() (the getter) also works on things that
are not a function.
The proposal is that the underlying C code will signal an error
when such replacement functions would create a function out of
"something not a function".
Why modify the C code for this?
This is how formals() and body() are defined at the moment:
> formals
function (fun = sys.function(sys.parent()))
{
if (is.character(fun))
fun <- get(fun, mode = "function", envir = parent.frame())
.Internal(formals(fun))
}
<bytecode: 0x153cde0>
<environment: namespace:base>
> body
function (fun = sys.function(sys.parent()))
{
if (is.character(fun))
fun <- get(fun, mode = "function", envir = parent.frame())
.Internal(body(fun))
}
<bytecode: 0xb452e8>
<environment: namespace:base>
Not sure why they are not simply doing fun <- match.fun(fun) but if
they were, then they would signal an error when called on something
that is not a function.
H.
Martin Maechler, ETH Zurich
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
--
Hervé Pagès
Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024
E-mail: hpa...@fredhutch.org
Phone: (206) 667-5791
Fax: (206) 667-1319
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel