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

efr*_*rey 12 language-agnostic scope lexical-scope

为来自其他语言的人进行R编程时, John Cook说

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

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

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

tor*_*rek 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?
Run Code Online (Sandbox Code Playgroud)

对于词法范围,答案是"激活f那个称为激活h",而动态范围则意味着"最近激活的任何变量命名为x"(可能不是f).另一方面,如果语言完全禁止使用x,那么毫无疑问"这x是什么",因为答案是"错误".:-)看起来有些人使用"静态范围"来引用第三种情况.

  • 是.当然,我(就像OP)实际上在猜测它们的含义. (2认同)