词法和静态范围之间的区别是什么?

时间:2012-04-21 19:36:54

标签: language-agnostic scope lexical-scope

R programing for those coming from other languages约翰库克说

  

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

我发现这很奇怪,因为我一直认为词法范围和静态范围是同义词。

词汇和静态范围是否有明显的属性,或者这是一种区别,从社区到社区,人与人之间的区别?如果是这样,那么一般的阵营是什么?我如何区分它们以便我们在使用这些词时更能理解某些人的意思。

2 个答案:

答案 0 :(得分:10)

Wikipedia(和我)同意你的观点“词汇范围”和“静态范围”是同义词。 This Lua discussion试图区分,但指出人们不同意这种区别。 : - )

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

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”并且动态范围意味着“最近激活的任何变量名为{{1} }“(可能不是x)。另一方面,如果语言完全禁止使用f,那么毫无疑问“哪个x是这个”,因为答案是“错误”。 :-)看起来有些人使用“静态范围”来引用第三种情况。

答案 1 :(得分: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中处理变量的方式更自然。