【发布时间】:2015-12-20 01:29:03
【问题描述】:
可以在编译时(或通过静态分析器,因为我的示例是在 Python 中)仅根据源代码中的位置来计算访问词法范围似乎很常见。
这是一个非常简单的例子,其中一个函数有两个闭包,a 的值不同。
def elvis(a):
def f(s):
return a + ' for the ' + s
return f
f1 = elvis('one')
f2 = elvis('two')
print f1('money'), f2('show')
我的想法没有问题,当我们在阅读函数f的代码时,当我们看到a时,它并没有在f中定义,所以我们弹出到封闭函数并找到一个在那里,这就是f 中的a 所指的。源代码中的位置足以告诉我f 从封闭范围中获取a 的值。
但正如here 所述,当调用函数时,其本地框架会扩展其父环境。所以在运行时进行环境查找是没有问题的。但我不确定的是,静态分析器总是可以在代码运行之前在编译时确定 which 闭包。在上面的例子中,很明显elvis 有两个闭包,很容易跟踪它们,但其他情况就不会这么简单了。直觉上,我很担心静态分析的尝试可能会遇到一般的停止问题。
那么词法作用域真的有一个动态的方面吗,源代码中的位置告诉我们涉及到一个封闭作用域,但不一定是指哪个闭包?或者这是编译器中已解决的问题,函数内对其闭包的所有引用真的可以静态详细地计算出来?
或者答案是否取决于编程语言——在这种情况下,词法作用域并不像我想象的那么强大?
[编辑@cmets:
就我的示例而言,我可以重申我的问题:我阅读了诸如“可以在编译时确定词法分辨率”之类的声明,但想知道如何在 f1 和 f2 中引用 a 的值静态/在编译时(通常)制定。
解决方案是,词法作用域并没有要求太多。 LS可以告诉我们,在编译时,只要我在 f 中,就会定义名为 a 的 something(这显然可以静态计算;这是词法范围的定义),但是确定它实际需要的 value 是 1) 超出 LS概念,2) 在运行时完成(非静态),因此在某种意义上是动态的,但当然 3) 使用不同于动态范围的规则。
引用@PatrickMaupin 的话,要传达的信息是“仍然需要完成一些动态工作。” ]
【问题讨论】:
-
还有什么意思?编程语言必须是确定性的,否则我们不会使用它们。事情已经够难了。
-
我不确定我是否理解这个问题。请问
f1和f2的值是否可以通过静态分析确定? -
根据定义,词法作用域是纯词法的。你只要看看封闭的词法函数,以及它的封闭函数,等等。
-
(在帖子的编辑中回复了 cmets。)
标签: python programming-languages lexical-scope