如何使用以下属性构建语言?
在开头和结尾之间可以有任意数量的陈述,如函数
你可以使用一个函数从任何地方(甚至是它自己)跳转到它的开头,它会执行它中包含的语句,直到它到达终点
您可以使用函数立即停止执行其内容并从
它包含的代码与其他所有代码的范围相同,因此您可以访问所有外部变量并创建新的变量,这些变量在离开构造时不会被删除。
总而言之,它就像一个goto
点,带有一个结尾,并且可以选择返回它的位置。
答案 0 :(得分:2)
BASIC有这个,它被称为gosub
,它对正确函数的唯一优势是你的最后一点,其中所有变量都在同一范围内。除此之外,它很糟糕。
在面向对象的语言中,通过将所需的变量封装到对象中并使用不同的方法相互调用,可以获得通常相同的效果。多个入口点不是大多数语言的特征,但您可以通过将方法分成更小的部分来解决这个问题。
答案 1 :(得分:1)
closure的概念可能是相关的。
闭包是一个函数,但它在某个范围内定义(另一个函数,比方说),它可以访问该范围内的所有变量。因此它具有您列出的大多数属性,除了在标题中声明并且(通常)具有名称。在任何情况下,标题都是语言实现细节,而不是这样的特征:-)。通常,闭包可以从定义它们的函数中返回,并且在GC语言中,它们将保持对它们使用的局部变量的引用。
还要考虑Perl有两种不同的范围变量 - 词法变量(“my”)和动态变量(“local”)。词汇变量是您习惯使用C,Java等的本地变量。从声明它们的块调用的任何函数都可以看到动态变量。因此,如果所有变量都使用local
声明,则所有Perl函数都具有所需的属性。
在所有情况下,我都错过了“创建在离开函数时未被破坏的新变量”。这是非常罕见的,因为它假定在函数中声明的变量具有全局范围,并且这不是大多数语言中的典型情况。你通常可以通过设置一些全局对象来伪装它,但这很少有用。
答案 2 :(得分:0)
由于问题被标记为"语言无关"我添加subroutines
的构造与procedures
的构造同义。
procedures
存在一些与语言相关的细微差别,例如SQL实现:
IN
,OUT
或INOUT
参数的可选参数列表; return
任何内容,只是改变了OUT
或INOUT
参数的值; @Steve Jessop Closures
在我的书中是一个非常不同的怪物。
虽然它们模仿procedure
的许多功能,但它们有自己的参数列表和调用堆栈,这使得它们可以访问外部作用域而不是procedure
/ subroutine
。
答案 3 :(得分:-1)
从程序结构来看,我称之为脚本。例如。一个shell /批处理脚本。
也许task是这种结构的更好名称,它可以是一个使用JavaScript或Perl的脚本,可以通过引用脚本本身来执行。