语言构造命名:Function / Goto

时间:2010-04-06 10:14:24

标签: language-agnostic function goto

如何使用以下属性构建语言?

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

  • 你可以使用一个函数从任何地方(甚至是它自己)跳转到它的开头,它会执行它中包含的语句,直到它到达终点

  • 您可以使用函数立即停止执行其内容并从

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

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

4 个答案:

答案 0 :(得分:2)

BASIC有这个,它被称为gosub,它对正确函数的唯一优势是你的最后一点,其中所有变量都在同一范围内。除此之外,它很糟糕。

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

答案 1 :(得分:1)

closure的概念可能是相关的。

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

还要考虑Perl有两种​​不同的范围变量 - 词法变量(“my”)和动态变量(“local”)。词汇变量是您习惯使用C,Java等的本地变量。从声明它们的块调用的任何函数都可以看到动态变量。因此,如果所有变量都使用local声明,则所有Perl函数都具有所需的属性。

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

答案 2 :(得分:0)

由于问题被标记为"语言无关"我添加subroutines的构造与procedures的构造同义。

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

  • 它具有孤立的范围(因此它不会弄乱无辜的常规变量);
  • 它有一个带有INOUTINOUT参数的可选参数列表;
  • 它没有return任何内容,只是改变了OUTINOUT参数的值;

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

虽然它们模仿procedure的许多功能,但它们有自己的参数列表和调用堆栈,这使得它们可以访问外部作用域而不是procedure / subroutine

答案 3 :(得分:-1)

从程序结构来看,我称之为脚本。例如。一个shell /批处理脚本。

也许task是这种结构的更好名称,它可以是一个使用JavaScript或Perl的脚本,可以通过引用脚本本身来执行。