10

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

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

会因为 x 未在函数内部定义而出错fact

一般来说,是否存在任何函数的范围不包括其中定义的函数的语言?

编辑:感谢您提供信息丰富的评论。我想到这一点的原因是,内部函数可以访问其包含函数提供的所有环境的情况听起来很接近 Joe Armstrong 在反对 OOP 的论点中描述的情况:

因为面向对象语言的问题在于,它们拥有随身携带的所有这些隐式环境。你想要一根香蕉,但你得到的是一只拿着香蕉和整个丛林的大猩猩。

同样相关的是,我听说新话语言没有全局命名空间,尽管我不知道它是如何工作的。

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

4

3 回答 3

8

我将尝试大致概述它在新话中的工作原理。

您编写的任何代码都必须在模块中。Module 是一种类,因为在Newspeak 类中可以包含其他类,Module 本质上是一个顶级类——一个不包含在另一个类中的类。Newspeak 的特别之处在于您不能引用模块之外的任何内容

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

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

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

于 2010-12-24T23:09:24.673 回答
0

我相信您可以制作一种编程语言,其中全局范围被替换为例如包含函数和对象的关联数组,然后将其作为工作环境传递给每个被调用的函数。

考虑以下示例。在常规 Python 程序中,您会编写如下内容:

import foo

def square(x):
    return x*x

print(square(int(raw_input("give a number: "))))

在没有全局变量的程序中,您宁愿编写如下内容:

def main(environment):
    environment['import']('foo')
    environment['square'] = lambda x: x*x
    environment['print'](environment['square'](int(environment['raw_input']("give a number:"))))

并且这段代码将在这样的上下文中执行:

def import_foo(modulename):
    # dummy example
    if modulename == 'foo':
        import foo

environment = {
    'import': import_foo,
    'print': print,
    'raw_input': raw_input
}

main(environment)

在采用这种方法且没有全局变量的程序中,程序中的函数几乎可以与所有东西完全隔离,除了它们可以通过它们获得的参数访问的东西。然后,您还可以为函数创建替代环境,然后在“监狱”中运行它们。库和函数就像电路中的电子元件,在您需要的地方,但也能够将这些部件连接到您想要的任何东西。考虑到这种模式的编程语言可能具有一些语法糖以方便自动将隐式“默认”环境传递给函数调用,但您始终可以显式强制它们使用您想要的任何替代环境。

For example, in a global-less language, if you have a library which is designed to access data in the operating system's file system or network, you could provide an alternative environment and monitor the I/O or make the library use your own virtual file system or a VPN connection instead of the regular file system and network.

于 2015-03-01T16:54:05.853 回答
-5

实际上,这样的事情永远不可能存在。考虑一下 - 当您打印到控制台时,控制台句柄来自哪里?当你提到一个函数时,这个函数是从哪里来的?它肯定不存在于您从中调用它的函数的堆栈中。没错——它是一个全球性的。现实情况是,如果没有全局变量,您永远无法引用不在堆栈或堆中的任何内容——这意味着没有机器指令,这要归功于 DEP。对于堆,你会从哪里得到一个堆?您不能调用操作系统函数来为您分配一些实际的新内存——这是一个全局的。

理论上,你可以创建这样的语言或程序,但现实情况是,它更像是 Brainfuck,而不是任何实际可用的东西。

于 2010-11-21T21:42:26.590 回答