我一直在用 BASIC 方言写一点,它有用户定义的函数,只能访问局部变量;例如,下面的代码:
let S$ = "Hello, world!"
fn.def someFunction$()
print S$
fn.rtn "a string"
fn.end
X$ = someFunction$()
将打印一个空行,因为S$
在 . 的上下文中没有值someFunction$
。
问题:是否有其他常用语言具有无法从函数内部访问的全局范围?
我一直在用 BASIC 方言写一点,它有用户定义的函数,只能访问局部变量;例如,下面的代码:
let S$ = "Hello, world!"
fn.def someFunction$()
print S$
fn.rtn "a string"
fn.end
X$ = someFunction$()
将打印一个空行,因为S$
在 . 的上下文中没有值someFunction$
。
问题:是否有其他常用语言具有无法从函数内部访问的全局范围?
这个问题的基础是误解。与大多数其他方言一样,Basic 的这种方言没有全局范围。同一类别中有许多语言。
先解释一下。许多早期的计算机语言都有一个定义所有变量的范围。当这变得过于限制时,他们添加了一个子程序功能,该功能要么共享相同的范围(COBOL PERFORM 和 BASIC GOSUB),要么定义一个完全独立的范围并传递参数(FORTRAN CALL 和 RETURN)。
一种语言不同:Algol。它定义了嵌套的词法范围,因此对变量的引用可以在块内或外部嵌套块。这是一个不寻常的功能,并未被广泛复制。
Fortran 还提供了一种称为 COMMON 的链接机制。这被其他一些语言所采用。C 添加了块作用域、外部作用域(带有外部链接),但没有嵌套函数,因此函数永远不能从另一个函数的作用域访问变量。
您询问的 Basic 方言属于 Basic/Fortran 家族。它对每个主程序和用户定义的函数都有不重叠的范围,但显然没有外部链接。不管它们是如何编写的,用户定义的函数都有自己的作用域,当然它们不能访问主程序中的变量,而主程序的作用域完全不同。Basic 的某些方言具有类似 COMMON 的功能,但我认为没有。
所以答案是大多数语言(这种)不提供嵌套范围,并且不允许内部范围访问外部范围的内容。[当然,Lisp 家谱完全不同。]
有一个有趣的例外。面向对象的语言大多源自 Simula,它是一种类似 Pascal 的语言,并引入了将方法处理嵌套在类范围内的思想。这个想法肯定已经流行起来了。