From mick.jordan at oracle.com  Fri May 20 21:40:44 2016
From: mick.jordan at oracle.com (Mick Jordan)
Date: Fri, 20 May 2016 12:40:44 -0700
Subject: [Rd] identical on closures
Message-ID: <573F683C.6070904@oracle.com>

I'm confused by this:

 > identical(function() {}, function() {})
[1] FALSE

Yet, after loading the Matrix package (which redefines det), the 
following is checked (in library.checkConflicts):

 > identical(get("det", baseenv()), get("det", asNamespace("Matrix")), 
ignore.environment=T)
[1] TRUE

I've looked at the code in identical.c and for closures it seems to 
compare the FORMALS and the BODY_EXPR, so why does the first example not 
return TRUE as surely the formals and body are identical?

     case CLOSXP:
     return(R_compute_identical(FORMALS(x), FORMALS(y), flags) &&
            R_compute_identical(BODY_EXPR(x), BODY_EXPR(y), flags) &&
            (IGNORE_ENV || CLOENV(x) == CLOENV(y) ? TRUE : FALSE) &&
            (IGNORE_BYTECODE || R_compute_identical(BODY(x), BODY(y), 
flags))
            );

R-3.2.4, Mac OS X El Capitan

Thanks
Mick Jordan



[Rd] identical on closures
Mick Jordan