[plt-scheme] Scheme and R

From: Eli Barzilay (eli at barzilay.org)
Date: Fri Mar 27 02:34:54 EDT 2009

On Mar 26, Neil Toronto wrote:
> Eli Barzilay wrote:
> > 
> > * We have a `void' value that is the common result of side-effect
> >   functions[1] -- we even have (surprise) a `when' expression, and
> >   one-sided `if's.  (It's not clear to me whether R implements
> >   this using a void value or using something like (values) -- but
> >   the choice between the two is irrelevant.)
> 
> In this case, he finally got to the real problem. It's not so much
> that "if" doesn't require an else branch or that a single-branch
> "if" returns NULL, but that the designers decided to make some uses
> of it "just work" by defining operations like this:
> 
>      > paste("Hello", NULL, "there", sep="|")
>      [1] "Hello||there"
> 
> So string-appending NULL appends nothing.

So this is a problem with implicit coercion -- that's a valid point.
But R is far from being a unique offender in this department.  (Even
Scheme treats any non-#f value as true.)  The point about numeric(0)
being a value with a fuzzy meaning is a valid point too, but much
smaller than the slides make it look like.


> Back to lexical scope. To get around = creating bindings and how
> that makes it difficult to mutate outer scope variables, R has a
> special assignment operator <<- that operates on the nearest outer
> scope. It also creates bindings there if they don't already
> exist. It's like Python's "global" but for any level. Funky.

I completely agree about the bad karma you get when you try to make
`=' both a mutator and a binder.  But again, that's an extremely
popular thorn in many languages...  (FWIW, I think that creating a
local binding is better than creating a global binding like JS does.)
One solution is to forbid (this kind of) mutation completely, which is
what ML does, and a less extreme one is to have a proper distinction
between definitions and assignments (which JS kind of does, except
that it becomes bogus when assignments can create bindings).

-- 
          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
                  http://www.barzilay.org/                 Maze is Life!


Posted on the users mailing list.