[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