12

为那些来自其他语言的人进行 R 编程时, John Cook 说

R 使用词法作用域,而 S-PLUS 使用静态作用域。差异可能很微妙,尤其是在使用闭包时。

我觉得这很奇怪,因为我一直认为词法作用域和静态作用域是同义词。

词汇和静态作用域是否有不同的属性,或者这是从社区到社区、个人到个人的区别?如果是这样,一般营地是什么,我如何区分它们,以便我可以更好地理解某人使用这些词时的含义。

4

2 回答 2

10

维基百科(和我)同意你的观点,术语“词汇范围”和“静态范围”是同义词。 这个 Lua 讨论试图做出区分,但指出人们不同意这种区别是什么。:-)

在我看来,尝试的区别与访问不同的函数激活记录(“堆栈块”,如果你愿意的话)中的名称有关,而不是最新的执行记录,这主要(仅?)发生在嵌套职能:

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?

对于词法范围,答案是“被f称为激活的激活h”,而对于动态范围,它意味着“具有任何名为的变量的最新激活x”(可能不是f)。另一方面,如果语言完全禁止使用x,则毫无疑问“这x是哪个”,因为答案是“错误”。:-) 看起来好像有些人使用“静态范围”来指代第三种情况。

于 2012-04-21T20:25:03.793 回答
4

R 官方文档还解决了 R 和 S-plus 之间的范围差异:http: //cran.r-project.org/doc/manuals/R-intro.html#Scope

链接中给出的示例可以简化如下:

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

S-Plus 和 R 的结果不同:

 ## 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

我个人认为在 R 中处理变量的方式更自然。

于 2012-07-09T18:42:27.780 回答