[Rd] proto and baseenv()

Gabor Grothendieck ggrothendieck at gmail.com
Fri Feb 26 13:09:47 CET 2010

On Fri, Feb 26, 2010 at 12:41 AM, Peter Danenberg <pcd at roxygen.org> wrote:
>> Also other object systems which are alternatives to proto seem less
>> relevant than basic scoping and free variable lookup in functions.
> Sorry, but that seems absurd; object systems are less relevant to each
> other than the totally orthogonal question of scope?

Yes, if you are using one then obviously you have decided to use it in
place of the other.  Also your example of S3 was misleading since it
used lists which do not have inheritance and did not truly illustrate
S3.  Free variables in S3 methods follow the same lookup procedure as
ordinary functions and using S3 together with proto works well.  In
fact, proto uses two S3 classes.

>> proto does that but uses the consistent default rather than the
>> inconsistent default that you prefer.
> $.proto falls back upon get(), I presume, because the authors didn't
> feel like recursing up the parent hierarchy themselves; I'll continue
> to believe that the scope pollution was an oversight until they
> contradict me. At which point I'll probably switch object systems.

Here I think you are admitting that the basic facilities of R do work
in the way proto does.

Also, your alternative likely would be unusable due to performance
whereas proto is fast enough to be usable (see list of applications
that use it at http://r-proto.googlecode.com/#Applications).  Its not
as fast as S3 (though sometimes you can get it that fast by optimizing
your code).  The development version of proto is even faster than the
current version of proto due to the addition of lazy evaluation.

> Vague appeals to consistency, when you're really only talking about
> naive get() semantics, don't mean much; especially after you've spent
> hours debugging mysterious bugs resulting from scope pollution.

In end it seems that your real beef is with R so perhaps you should be
using a different language.

With respect to proto its really just discussing whether to use

proto(baseenv(), ...) vs proto(...)

since the former gives you everything you want and the distinction
seems pretty trivial given how easy it is to use one or the other.  If
you used iolanguage or similar you would have to specify Object so
there is not even a penalty in terms of compactness.

There have also been threads on how to "fix" scoping in R for
individual functions and various manipulations of environments have
been suggested but in the end no one does this in practice.  In proto
at least you can do the part you want and its trivial to do so.

More information about the R-devel mailing list