On Jan 12, 2013, at 17:02 , Gabor Grothendieck wrote:

> The is.pos function below results in the variable, out, being set to
> TRUE if the first argument to is.pos is positive and to FALSE
> otherwise.
> 
> It does this without using the return value or using scoping tricks to
> reach into the caller.  Instead it tricks the promise into
> communicating one bit of information upwardly from the function to its
> caller via the second argument.
> 
> One would have thought this to be impossible.  Is this intended behavior?

Yes, this is a generic consequence of lazy evaluation: delayed and 
unpredictable side effects. Whether it is desirable is an open issue; it is the 
sort of thing that creates serious headaches for compiler constructors, but it 
is pretty much unavoidable once you include the lazy eval feature.

> 
> is.pos <- function(i, x) { if (i > 0) x; NULL }
> 
> # in this example actual arg1 of is.pos is positive
> out <- FALSE
> is.pos(1, out <- TRUE)
> out # TRUE
> 
> # in this example actual arg1 of is.pos is negative
> out <- FALSE
> is.pos(-1, out <- TRUE)
> out # FALSE
> 
> --
> Statistics & Software Consulting
> GKX Group, GKX Associates Inc.
> tel: 1-877-GKX-GROUP
> email: ggrothendieck at gmail.com
> 
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd....@cbs.dk  Priv: pda...@gmail.com

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

Reply via email to