On Jan 11, 2011, at 6:55 PM, <luke-tier...@uiowa.edu> <luke-tier...@uiowa.edu> 
wrote:

> No. Lots of internal functions expect their callers to protect their 
> arguments, for efficiency reasons. eval is called very often and almost 
> always with argument that are protected because they are in the evaluation 
> engine, so it would be wasteful and potentially very costly if eval protected 
> its arguments every time it is called. (I don't tknow what the cost would be 
> to do so in the current implementation but it could be prohibitive if we 
> moved to some different approaches, so for now we whould continue to expect 
> callers of eval to make sure the argumetns are protected.)
> 


Fair enough. It would be nice if this was explicitly documented since eval() is 
part of the API and I see several packages on CRAN using eval(LCONS(..),..) and 
eval(listX(...),...) - and I don't blame them (partly because one of them is 
mine ;)). Unfortunately all the examples in R-ext use implicitly protected 
arguments (as function arguments or parts of larger already protected 
constructs) so it's not obvious from that, either.

Thanks,
Simon




> 
> 
> On Tue, 11 Jan 2011, Simon Urbanek wrote:
> 
>> Interesting, I'd argue that the bug is in eval() not protecting its 
>> arguments since the usual convention is for functions to protect its 
>> arguments...
>> 
>> On Jan 11, 2011, at 2:33 PM, Romain Francois wrote:
>> 
>>> Hello,
>>> 
>>> Using R-devel (rev 53950), I get inconsistent results with as.environment( 
>>> VECSXP ) when gctorture is on.
>>> 
>>> Consider:
>>> 
>>> a <- list( aa = rnorm, bb = runif )
>>> gctorture(TRUE)
>>> as.environment( a )
>>> 
>>> The last line sometimes produces the correct environment, but sometimes I 
>>> get errors. Here are the three situations:
>>> 
>>> # good
>>>> as.environment( a )
>>> <environment: 0x100b1c978>
>>> 
>>> # not good
>>>> as.environment( a )
>>> Erreur dans length(x) : 'x' est manquant
>>> 
>>> # not good either
>>>> as.environment( a )
>>> Erreur dans list(NULL, list(aa = function (n, mean = 0, sd = 1)  :
>>> correspondance partielle de chaînes de caractères incorrecte
>>> 
>>> 
>>> Is it because the call made by lang4 is not protected while evaluated in 
>>> this line :
>>> 
>>>   case VECSXP: {
>>>     /* implement as.environment.list() {isObject(.) is false for a list} */
>>>     return(eval(lang4(install("list2env"), arg,
>>>                       /*envir = */R_NilValue, /* parent = */R_EmptyEnv),
>>>                 rho));
>>>   }
>>> 
>>> 
>>> (BTW, this was detected in a looooooooong Rcpp-devel thread. See 
>>> http://comments.gmane.org/gmane.comp.lang.r.rcpp/1336)
>>> 
>>> Romain
>>> 
>>> --
>>> Romain Francois
>>> Professional R Enthusiast
>>> +33(0) 6 28 91 30 30
>>> http://romainfrancois.blog.free.fr
>>> |- http://bit.ly/fT2rZM : highlight 0.2-5
>>> |- http://bit.ly/gpCSpH : Evolution of Rcpp code size
>>> `- http://bit.ly/hovakS : RcppGSL initial release
>>> 
>>> ______________________________________________
>>> R-devel@r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>> 
>>> 
>> 
>> ______________________________________________
>> R-devel@r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
> 
> -- 
> Luke Tierney
> Statistics and Actuarial Science
> Ralph E. Wareham Professor of Mathematical Sciences
> University of Iowa                  Phone:             319-335-3386
> Department of Statistics and        Fax:               319-335-3017
>   Actuarial Science
> 241 Schaeffer Hall                  email:      l...@stat.uiowa.edu
> Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to