在R编程指南: 从其他编程语言过来的人看中,John Cook提到:
R使用词法作用域(lexical scoping),而S-PLUS使用静态作用域(static scope)。这种差异可能是微妙的,特别是在使用闭包时。
我觉得这很奇怪,因为我一直认为词法作用域和静态作用域是同义词。
词法作用域和静态作用域有不同的属性,还是这种区别因社区而异、因人而异?如果有,那么有哪些主要的派别,如何区分它们,以便更好地理解别人使用这些术语的意思。
在R编程指南: 从其他编程语言过来的人看中,John Cook提到:
R使用词法作用域(lexical scoping),而S-PLUS使用静态作用域(static scope)。这种差异可能是微妙的,特别是在使用闭包时。
我觉得这很奇怪,因为我一直认为词法作用域和静态作用域是同义词。
词法作用域和静态作用域有不同的属性,还是这种区别因社区而异、因人而异?如果有,那么有哪些主要的派别,如何区分它们,以便更好地理解别人使用这些术语的意思。
维基百科(以及我)认为"词法作用域"和"静态作用域"这两个术语是同义词。这个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?
根据词法作用域,答案是“调用h
的f
激活”,对于动态作用域,意思是“具有任何名为x
的变量的最近激活”(可能不是f
)。另一方面,如果语言完全禁止使用x
,那么就不存在“这是哪个x
”的问题,因为答案是“错误”。 :-)看起来有些人使用“静态作用域”来指称这第三种情况。
%
名称前缀看起来比这个assign
业务有趣得多。https://stat.ethz.ch/pipermail/r-help/2005-June/073091.html - efrey 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