2

如何调用具有以下属性的语言构造?

  • 它有一个开始和一个结束,就像一个函数
  • 它有一个包含它的名称的标题,也像一个函数但没有参数
  • 在它的开头和结尾之间可以有任意数量的语句,就像一个函数

  • 您可以使用一个函数从任何地方(甚至它自己)跳转到它的开头,它将执行其中包含的语句,直到它到达它的结尾

  • 您可以使用函数立即停止执行其内容并跳回调用它的位置

  • 它包含的代码与其他所有代码在同一范围内,因此您可以访问外部的所有变量并创建新的变量,这些变量在离开构造时不会被删除。

总而言之,它就像一个goto有终点的点,并且可以选择返回调用它的位置。

4

4 回答 4

2

BASIC 有这个,它被调用gosub了,它相对于正确函数的唯一优势是你的最后一点,所有变量都在同一个范围内。除此之外,它很烂。

在面向对象的语言中,通常可以通过将所需的变量封装到对象中并让不同的方法相互调用来实现相同的效果。多个入口点不是大多数语言的特性,但您可以通过将方法拆分成更小的部分来解决这个问题。

于 2010-04-06T10:33:16.233 回答
1

闭包的概念可能是相关的。

闭包是一个函数,但它是在某个范围内定义的(比如说另一个函数),并且它可以访问该范围内的所有变量。因此,它具有您列出的大多数属性,除了在标题中声明并且(通常)具有名称。在任何情况下,标头都是语言实现细节,而不是这样的功能:-)。通常闭包可以从定义它们的函数中返回,并且在 GC 语言中,它们将维护对它们使用的局部变量的引用。

还要考虑 Perl 有两种不同的作用域变量——词法变量(“my”)和动态变量(“local”)。词法变量是您在 C、Java 等语言中习惯使用的局部变量。从声明它们的块调用的任何函数都可以看到动态变量。因此,如果所有变量都用 声明local,那么所有 Perl 函数都具有所需的属性。

在所有情况下,我都错过了“创建在离开函数时不会被破坏的新变量”。这是非常罕见的,因为它假设在函数中声明的变量具有全局范围,这不是大多数语言的典型情况。您通常可以通过拥有一些全局对象并在其上悬挂一些东西来伪造它,但它很少有用。

于 2010-04-06T10:49:22.690 回答
0

由于该问题被标记为“与语言无关”,因此我要补充说构造 ofsubroutines是构造 of 的同义词procedures

procedures例如 SQL 实现有一些与语言相关的细微差别:

  • 它具有孤立的范围(这样它就不会弄乱无辜的常备变量);
  • 它有一个带有INOUTINOUT参数的可选参数列表;
  • 它什么也不做return,只是改变OUTorINOUT参数的值;

@Steve JessopClosures在我的书中是一个非常不同的怪物。

虽然它们确实模仿了 a 的许多特性procedure,但它们有自己的参数列表和调用堆栈,这使它们能够访问外部范围而不是procedure/ subroutine

于 2011-05-29T18:37:29.543 回答
-1

从程序的结构来看,我称之为脚本。例如外壳/批处理脚本。

也许任务是这种结构的更好名称,它可以是使用 JavaScript 或 Perl 的脚本,只需引用脚本本身即可执行。

于 2010-04-06T10:34:45.063 回答