【问题标题】:What are the distinctions between lexical and static scoping?词法作用域和静态作用域有什么区别?
【发布时间】:2012-05-02 23:43:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我猜他们的意思是 dynamic 而不是 lexical
  • @Mehrdad R 不是动态作用域
  • 奇怪.. 想知道他们当时的意思。谢谢你告诉我。

标签: language-agnostic scope lexical-scope


【解决方案1】:

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

【讨论】:

  • 也就是说,没有闭包的词法作用域?
  • 是的。当然,我(像 OP 一样)实际上是在猜测它们的意思。
  • 关于 S-PLUS 与 R 范围界定的讨论似乎可以支持您的主张。 Lua 的% 名称前缀似乎比assign 业务有趣得多。 stat.ethz.ch/pipermail/r-help/2005-June/073091.html
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2013-11-03
    • 2023-04-08
    • 2011-05-09
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多