[Rd] Tricking Promises into Sending Info Via Args into Caller

peter dalgaard pdalgd at gmail.com
Sat Jan 12 18:19:21 CET 2013

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 at 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.mes at cbs.dk  Priv: PDalgd at gmail.com

More information about the R-devel mailing list