From p.dalgaard at biostat.ku.dk  Tue Mar  8 19:10:26 2005
From: p.dalgaard at biostat.ku.dk (Peter Dalgaard)
Date: Tue Mar  8 19:16:56 2005
Subject: [Rd] Bug in handling of promises?
In-Reply-To: <bemr21dafvf5sp687mk0jpob2rual9ilan@4ax.com>
References: <bemr21dafvf5sp687mk0jpob2rual9ilan@4ax.com>
Message-ID: <x23bv6dn59.fsf@biostat.ku.dk>

Duncan Murdoch <murdoch@stats.uwo.ca> writes:

[snip]
> So I tried to explicitly force it:
> 
> > g <- function( H, prevEnv = NULL) {
> +     if (!is.null(prevEnv)) H <- prevEnv$H
> +     force(H)   
> +     return(environment(NULL))
> + }
> 
> but this still doesn't work:
> 
> > env <- g( function(x) x^2 )
> > env$H
> <promise: 01206FC0>
> > env$H(1)
> Error: attempt to apply non-function
> 
> It seems that I need to do an assignment to convert H from a promise
> to an evaluated object:
> 
> > h <- function( H, prevEnv = NULL) {
> +     if (!is.null(prevEnv)) H <- prevEnv$H
> +     H <- H     
> +     return(environment(NULL))
> + }
> > env <- h( function(x) x^2 )
> > env$H
> function(x) x^2
> > env$H(1)
> [1] 1
> 
> Is this a bug, or just the way things are?
> 
> I get the same results in both R-patched and R-devel.

Hmm, I don't think it is a bug as such that a promise in a function
environment stays a promise. Otherwise the semantics of substitute()
get messed up. However, it is a bit peculiar that the evaluator
doesn't extract the value when such an object is encountered in an
expression. Apparently (conjecture!) this is only done during variable
lookup, but not on return values from functions:

> env <- g( 2 )
> env$H+2
Error in env$H + 2 : non-numeric argument to binary operator
> with(env,H+2)
[1] 4
> x <- env$H
> x+2
[1] 4


-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)             FAX: (+45) 35327907


[Rd] Bug in handling of promises?
Peter Dalgaard