2012-04-21 11 views
12

En R programing for those coming from other languages John Cook dice que¿Cuáles son las distinciones entre alcance léxico y estático?

R utiliza ámbito léxico, mientras que S-PLUS utiliza alcance estático. La diferencia puede ser sutil, particularmente cuando se usan cierres.

Me pareció extraño porque siempre pensé que el alcance léxico y el alcance estático también.

¿Existen distintos atributos para el alcance léxico y estático, o se trata de una distinción que cambia de comunidad a comunidad, de persona a persona? Si es así, ¿cuáles son los campos generales y cómo los distingo para poder entender mejor el significado de alguien cuando usan estas palabras?

+0

Supongo que querían decir 'dynamic' en lugar de' lexical'. – Mehrdad

+2

@Mehrdad R no tiene un alcance dinámico – efrey

+0

Weiird .. curioso de ver lo que significaban entonces. Gracias por hacérmelo saber. – Mehrdad

Respuesta

10

Wikipedia (y) estoy de acuerdo con usted en que los términos "ámbito léxico" y "alcance estático" son sinónimos. This Lua discussion trata de hacer una distinción, pero señala que las personas no están de acuerdo con respecto a qué es esa distinción. :-)

Me parece que el intento de distinción tiene que ver con acceder a los nombres en un registro de activación de función ("bloque de pila") distinto del registro de ejecución más actual, que principalmente (? solamente) se produce en funciones anidadas:

function f: 
    var x 
    function h: 
     var y 
     use(y) -- obviously, accesses y in current activation of h 
     use(x) -- the question is, which x does this access? 

con ámbito léxico, la respuesta es "la activación de f que llama la activación de h" y con el alcance dinámico que significa "la activación más reciente que tiene cualquier variable named x "(que podría no ser f). Por otro lado, si el lenguaje prohíbe el uso de x en absoluto, no hay dudas sobre "qué x es esto" ya que la respuesta es "error". :-) Parece que algunas personas usan "alcance estático" para referirse a este tercer caso.

+1

Entonces, en otras palabras, ¿alcance léxico sin cierre? – Mehrdad

+2

Sí. Por supuesto que (como el OP) en realidad estoy adivinando lo que significan. – torek

+0

Interesante ... +1 genial – Mehrdad

4

documentación oficial R también se ocupa de las diferencias de alcance entre R y S-plus: http://cran.r-project.org/doc/manuals/R-intro.html#Scope

El ejemplo dado desde el enlace se puede simplificar así:

cube <- function(n) { 
    sq <- function() n*n 
    n*sq() 
} 

Los resultados del S-Plus y R son diferentes:

## first evaluation in S 
S> cube(2) 
Error in sq(): Object "n" not found 
Dumped 
S> n <- 3 
S> cube(2) 
[1] 18 
## then the same function evaluated in R 
R> cube(2) 
[1] 8 

Personalmente creo que la forma de tratar la variable en R es más natural.

Cuestiones relacionadas