任何功能无法访问全局范围的语言?

时间:2014-04-21 14:21:56

标签: language-design language-implementation

我一直在用BASIC的方言写一点,它有用户定义的函数,只能访问局部变量;例如,以下代码:

let S$ = "Hello, world!"

fn.def someFunction$()
    print S$
    fn.rtn "a string"
fn.end

X$ = someFunction$()

会打印一个空行,因为S$someFunction$的上下文中没有值。

问题:是否有其他常用的语言具有无法从函数内部访问的全局范围?

1 个答案:

答案 0 :(得分:2)

这个问题的基础是误解。与其他大多数人一样,这种基本方言没有全球范围。同一类别中有许多语言。

首先解释一下。许多早期的计算机语言都有一个范围,其中定义了所有变量。当这变得过于局限时,他们添加了一个子程序功能,该功能要么共享相同的范围(COBOL PERFORM和BASIC GOSUB),要么通过参数传递(FORTRAN CALL和RETURN)定义一个完全独立的范围。

一种语言不同:Algol。它定义了嵌套的词法范围,因此对变量的引用可以在块内或外部嵌套块中。这是一个不寻常的功能,并没有被广泛复制。

Fortran还提供了一种名为COMMON的链接机制。这被其他一些语言采用。 C添加了块范围,外部范围(使用外部链接),但没有嵌套函数,因此函数永远不能从另一个函数的范围访问变量。

你要问的基本方言属于Basic / Fortran家族。它具有每个主程序和用户定义函数的非重叠范围,但显然没有外部链接。无论它们是如何编写的,用户定义的函数都有自己的范围,当然它们无法访问主程序中的变量,主程序的范围完全不同。 Basic的一些方言具有类似COMMON的功能,但我不认为这个功能。

所以答案是大多数语言(这种类型)不提供嵌套作用域,并且不允许内部作用域访问外部作用域的内容。 [当然,Lisp家族树是完全不同的。]

有一个有趣的例外。面向对象的语言主要来自Simula,它是一种类似Pascal的语言,并引入了将方法嵌套在类范围内的思想。这个想法肯定流行起来。