On Tue, 9 Dec 2008, Wacek Kusnierczyk wrote:
Stavros Macrakis wrote:
I've read in many places that R semantics are based on Scheme semantics. As
a long-time Lisp user and implementor, I've tried to make this more precise,
and this is what I've found so far. I've excluded trivial things that
aren't basic semantic issues: support for arbitrary-precision integers;
subscripting; general style; etc. I would appreciate corrections or
additions from more experienced users of R -- I'm sure that some of the
points below simply reflect my ignorance.
==Similarities to Scheme==
R has first-class function closures. (i.e. correctly supports upward and
downward funarg).
R has a single namespace for functions and variables (Lisp-1).
==Important dissimilarities to Scheme (as opposed to other Lisps)==
R is not properly tail-recursive.
R does not have continuations or call-with-current-continuation or other
mechanisms for implementing coroutines, general iterators, and the like.
there is callCC, for example, which however seems kind of obsolete.
There is nothing obsolete about it. It supports only downward or
dynamic extent continuations and so is not useful (nor intended) for
the things Stavros mentions. It is useful for escaping from deeply
nested function calls, for example recursive examination of tree
structures -- that is why it exists. At some point upward (at least
one-shot) contitnuations may be added as well, but probably not soon.
luke
R supports keyword arguments.
==Similarities to Lisp and other dynamic languages, including Scheme==
R is runtime-typed and garbage-collected.
R supports nested read-eval-print loops for debugging etc.
R expressions are represented as user-manipulable data structures.
==Dissimilarities to all (modern) Lisps, including Scheme==
R has call-by-need, not call-by-object-value.
R does not have macros.
R objects are values, not pointers, so a<-1:10; b<-a; b[1]<-999; a[1] =>
999. Similarly, functions cannot modify the contents of their arguments.
have you actually tried this code? even if the objects are values not
pointers, assignment causes, in cases such as the above, copying the
value with modifications applied as needed. thus, a[1] -> 1, not 999,
even though after b<-a b and a are the same value object.
try the following:
system.time(x<-1:(10^8))
system.time(y<-x)
system.time(y[1]<-0)
system.time(y[2]<-0)
head(x)
head(y)
with some trickery, functions can modify the contents of their
arguments, using deparse/substitute and assign:
a <- 1
f <- function(x) assign(deparse(substitute(x)), 0, parent.frame())
f(a)
a
the 'cannot modify the contents' does not apply to arguments that are
environments:
e <- new.env(parent=emptyenv())
l <- list()
f <- function(e) e$a = 0
f(e)
e$a
f(l)
l$a
There is no equivalent to set-car!/rplaca (not even pairlists and
expressions). For example, r<-pairlist(1,2); r[[1]]<-r does not create a
circular list. And in general there doesn't seem to be substructure sharing
at the semantic level (though there may be in the implementation).
computations on environment objects seem not to be subject to the
copy-value-on-assignment semantics:
e <- new.env(parent=emptyenv())
ee <- e
e$a <- 0
ee$a
R does not have multiple value return in the Lisp sense.
R assignment creates a new local variable on first assignment, dynamically.
So static analysis is not enough to determine variable reference (R is not
referentially transparent). Example: ff <- function(a){if (a) x<-1; x} ;
x<-99; ff(T) -> 1; ff(F) -> 99.
In R, most data types (including numeric vectors) do not have a standard
external representation which can be read back in without evaluation.
R coerces logicals to numbers and numbers to strings. Lisps are stricter
about automatic type conversion -- except that false a.k.a. NIL == () in
Lisps other than Scheme.
types are not treated coherently. in some situations, r coerces doubles
to complex (according to the hierarchy of types specified here and there
in the man pages), in others it won't:
x <- as.double(-1)
y <- as.complex(-1)
x == y
sqrt(x)
sqrt(y)
in certain cases, r will also do implicit inverse (downward) coercion:
is(y:y)
vQ
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
--
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa Phone: 319-335-3386
Department of Statistics and Fax: 319-335-3017
Actuarial Science
241 Schaeffer Hall email: [EMAIL PROTECTED]
Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.