词法作用域和静态作用域有什么区别?

12

R编程指南: 从其他编程语言过来的人看中,John Cook提到:

R使用词法作用域(lexical scoping),而S-PLUS使用静态作用域(static scope)。这种差异可能是微妙的,特别是在使用闭包时。

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

词法作用域和静态作用域有不同的属性,还是这种区别因社区而异、因人而异?如果有,那么有哪些主要的派别,如何区分它们,以便更好地理解别人使用这些术语的意思。


我猜他们的意思是使用“动态”而不是“词法”。 - user541686
2
@Mehrdad R 不是动态作用域。 - efrey
有点奇怪..好奇他们当时是什么意思。谢谢你告诉我。 - user541686
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?

根据词法作用域,答案是“调用hf激活”,对于动态作用域,意思是“具有任何名为x的变量的最近激活”(可能不是f)。另一方面,如果语言完全禁止使用x,那么就不存在“这是哪个x”的问题,因为答案是“错误”。 :-)看起来有些人使用“静态作用域”来指称这第三种情况。


1
那么换句话说,没有闭包的词法作用域? - user541686
2
是的。当然,我(像楼主一样)实际上是在猜测他们的意思。 - torek
这篇关于S-PLUS与R作用域的讨论似乎支持了你的说法。Lua的名称前缀看起来比这个assign业务有趣得多。https://stat.ethz.ch/pipermail/r-help/2005-June/073091.html - efrey

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中处理变量的方式更加自然。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接