是否有没有全局变量的编程语言?

Muh*_*uri 9 programming-languages newspeak

是否存在以不扩展到封闭函数的方式定义范围的语言?换句话说,有一种语言,其中的代码如下(类似Python的语法):

>>> x = 3
>>> def fact(n):
...     print x
...     return reduce(lambda u, v: u*v, xrange(1, n+1), 1)
...     
Run Code Online (Sandbox Code Playgroud)

会产生错误,因为x未在函数内定义fact

通常,是否存在任何函数的范围不包含其中定义的函数的语言?

编辑:感谢您提供的信息.我之所以想到这一点,是因为内部函数能够访问其包含函数所提供的所有环境的情况听起来非常接近我对Joe Armstrong在他反对OOP的论证中描述的情况:

因为面向对象语言的问题是他们已经拥有了所有这些隐含的环境.你想要一个香蕉,但你得到的是一只拿着香蕉和整个丛林的大猩猩.

另外相关的是,我听说语言没有全局命名空间,但我不知道它是如何工作的.

我可以想象在下面的Brian的评论中提出的内置函数(从__builtins__Pythonspeak或System中导入的函数在许多其他语言中)的问题是由解释器/编译器在每个函数中人为引入的.毕竟他们几乎总是特别用语言对待.另一种选择是将它们作为对象的方法作为参数传递给函数或从内部作为模块导入.

Yar*_*ena 8

我将尝试粗略概述它在Newspeak中的工作原理.

您编写的任何代码都必须位于模块中.Module是一种类,因为在Newspeak类中可以包含其他类,Module本质上是一个顶级类 - 一个不包含在另一个类中.Newspeak的特别之处在于,您无法参考模块之外的任何内容.

那么如何在Newspeak中打印到控制台?打印属于Console类(又名Smalltalk的Transcript),它是Platform模块的一部分.为了能够打印到控制台,您的模块将采用Platform构造函数参数,从平台获取控制台,将控制台存储在插槽中,然后使用它进行打印.

基本上它就像在语言级别强制执行依赖注入一样.语言IDE和运行时可以帮助您打包和引导您的程序,但如果您正在寻找更多详细信息 - 请访问Gilad Bracha的博客,例如查看此帖子,或查看Newspeak Modules文件.

PS Newspeak既不是不切实际也不能用于记录 - 它用于工业环境,现在有一个小的(但正在增长的)开源社区.Newspeak是一个非常新的和不断发展的,当然,但从个人经验来看 - 编写程序非常容易和有趣.