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