在为那些来自其他语言的人进行 R 编程时, John Cook 说
R 使用词法作用域,而 S-PLUS 使用静态作用域。差异可能很微妙,尤其是在使用闭包时。
我觉得这很奇怪,因为我一直认为词法作用域和静态作用域是同义词。
词汇和静态作用域是否有不同的属性,或者这是从社区到社区、个人到个人的区别?如果是这样,一般营地是什么,我如何区分它们,以便我可以更好地理解某人使用这些词时的含义。
在为那些来自其他语言的人进行 R 编程时, John Cook 说
R 使用词法作用域,而 S-PLUS 使用静态作用域。差异可能很微妙,尤其是在使用闭包时。
我觉得这很奇怪,因为我一直认为词法作用域和静态作用域是同义词。
词汇和静态作用域是否有不同的属性,或者这是从社区到社区、个人到个人的区别?如果是这样,一般营地是什么,我如何区分它们,以便我可以更好地理解某人使用这些词时的含义。
维基百科(和我)同意你的观点,术语“词汇范围”和“静态范围”是同义词。 这个 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
是哪个”,因为答案是“错误”。:-) 看起来好像有些人使用“静态范围”来指代第三种情况。
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 中处理变量的方式更自然。