From kry|ov@r00t @end|ng |rom gm@||@com  Wed Apr  5 08:53:28 2023
From: kry|ov@r00t @end|ng |rom gm@||@com (Ivan Krylov)
Date: Wed, 5 Apr 2023 09:53:28 +0300
Subject: [Rd] removeSource() vs. function literals
In-Reply-To: <509b2249-d533-6f15-5b14-c5cfb8218059@gmail.com>
References: <20230330173239.72da4e14@arachnoid>
 <509b2249-d533-6f15-5b14-c5cfb8218059@gmail.com>
Message-ID: <20230405095328.0424a3ca@Tarkus>

Thanks for the comments and sorry I didn't reply sooner!

On Thu, 30 Mar 2023 12:38:24 -0400
Duncan Murdoch <murdoch.duncan at gmail.com> wrote:

> You'd need to recurse through all expressions in the object.  Some of
> those expressions might be environments, so your changes could leak
> out of the function you're working on.

In my efforts to get arbitrary objects to hash consistently, I already
walk them recursively, but I do stop at environments. (In theory, it
could be possible to create mock environments with the same
relationships between each other and then "fix up" and hash their
contents, but it's hard to do right. Imagine environments e1 and e2
where e1$other <- e2 and e2$other <- e1.)

I think that removeSource() already walks language objects recursively,
it just doesn't remove source references from unevaluated function
expressions.

> Things are simpler if you know the expression is the unmodified
> result of parsing source code, but if you know that, wouldn't you
> usually be able to control things by setting keep.source = FALSE?

I receive the expression object from substitute(). The idea is to hash
the expression, locate and hash its dependencies and then see if
there's already a file named like the resulting hash. In theory, the
user could be constructing elaborate scary-looking expressions and then
calling my function on them, but I think I can be reasonably certain I
get the calls straight from the parser. Unfortunately, this doesn't put
me in a position to be controlling options(keep.source=...).

> Maybe a workable solution is something like parse(deparse(expr,
> control = "exact"), keep.source = FALSE).

Thanks for this idea! At some point I was considering hashing text
representations of objects, but then I got serialize()-hashing working
and forgot about it.

-- 
Best regards,
Ivan



[Rd] removeSource() vs. function literals
Ivan Krylov