Programming languages 超出标准条件和循环的控制结构?

Programming languages 超出标准条件和循环的控制结构?,programming-languages,control-structure,structured-programming,Programming Languages,Control Structure,Structured Programming,结构化编程语言通常有一些控制结构,如while,if,for,do,switch,break,和continue,用于表示源代码中的高级结构 然而,多年来提出的许多其他控制结构尚未进入现代编程语言。例如,在Knuth的论文“第275页”中,他引用了一个控制结构,它看起来像是异常处理的精简版本: loop until event1 or event2 or ... eventN /* ... */ leave with event1; /* ... */ repeat; then

结构化编程语言通常有一些控制结构,如
while
if
for
do
switch
break
,和
continue
,用于表示源代码中的高级结构

然而,多年来提出的许多其他控制结构尚未进入现代编程语言。例如,在Knuth的论文“第275页”中,他引用了一个控制结构,它看起来像是异常处理的精简版本:

loop until event1 or event2 or ... eventN
   /* ... */
   leave with event1;
   /* ... */
repeat;
then event1 -> /* ... code if event1 occurred ... */
     event2 -> /* ... code if event2 occurred ... */
     /* ... */
     eventN -> /* ... code if eventN occurred ... */
fi;
这似乎是一个有用的结构,但我还没有看到任何语言将其作为标准异常处理的特例来实际实现

类似地,Edsger Dijkstra经常使用一种控制结构,在这种结构中,许多代码中的一段根据一组可能为真的条件不确定地执行。你可以在其他地方看到这一点。示例代码可能如下所示:

do
    /* Either of these may be chosen if x == 5 */
    if x <= 5 then y = 5;
    if x >= 5 then y = 137; 
od;
var res1, res2;
await {
    doOneThing(defer(res1));
    andAnother(defer(res2));
}
thenDoSomethingWith(res1, res2);
do
/*如果x==5,则可以选择其中一个*/
如果x=5,则y=137;
od;
<> P>我理解历史上C影响了许多现代语言,如C++、C语言和java,我们现在使用的许多控制结构都是基于C提供的小集合。然而,程序员们喜欢思考我们喜欢的可替代的控制结构,但是很多编程语言都没有支持。 我的问题是-现在使用的通用语言支持与我上面提到的C风格控制结构完全不同的控制结构吗?这样的控制结构不一定是不能用标准C结构表示的东西-几乎任何东西都可以这样编码-但理想情况下,我想举一个例子,让您以一种与C模型完全不同的方式处理某些编程任务

不,“函数式编程”并不是一个真正的控制结构

也许不是“完全不同”,但“异步”控制结构是相当新的

Async允许并行执行非阻塞代码,一旦完成,控制返回到主程序流。尽管嵌套回调也可以实现同样的效果,但以这种方式执行任何非琐碎的操作都会很快产生繁杂的代码

例如,在即将发布的C#/VB版本中,Async允许调用异步API,而无需将代码拆分为多个方法或lambda表达式。也就是说,不再进行回调。“wait”和“async”关键字使您能够编写异步方法,这些方法可以暂停执行而不消耗线程,然后稍后在停止的地方继续执行

// C#
async Task<int> SumPageSizesAsync(IList<Uri> uris)
{
    int total = 0;
    var statusText = new TextBox();

    foreach (var uri in uris)
    {
        statusText.Text = string.Format("Found {0} bytes ...", total);
        var data = await new WebClient().DownloadDataTaskAsync(uri);
        total += data.Length;
    }

    statusText.Text = string.Format("Found {0} bytes total", total);
    return total;
}
C#/Python迭代器/生成器

def integers():
    i = 0
    while True:
        yield i
        i += 1
(我对这个主题了解不多,所以我把它标记为wiki)

简单的例子:

sign x |  x >  0        =   1
       |  x == 0        =   0
       |  x <  0        =  -1
符号x | x>0=1
|x==0=0
|x<0=-1
或者,比方说,斐波那契,它看起来几乎和数学方程一样:

fib x | x < 2       = 1
      | x >= 2      = fib (x - 1) + fib (x - 2)
fib x | x<2=1
|x>=2=fib(x-1)+fib(x-2)
  • 因为Haskell是,所以每个函数调用本质上都是一个控制结构
  • 在ML中,派生语言将分支、变量绑定和解构对象合并到单个控制结构中
  • 公共Lisp类似于可以重新启动的异常
  • Scheme和其他语言支持在任何时候暂停、恢复或重新启动程序

只是一个小小的旁注:多年来我一直想要一个“for…else”构造,几个月前我才发现它在Python中是可行的。@Radagaisus:for…else是什么?@Mehrdad:for else循环中的else块在循环自然终止(而不是中断)时执行。无论迭代多少次(甚至是零次),这都适用。它按照BoltClock所说的做。当使用
var found=false
编写循环时,我总是觉得太冗长@波洛克:啊,我明白了。。。奇怪,哈哈。这很像懒惰的评估。例如,在Haskell中:
取2[1,2,3,4]
->
[1,2]
@Radagaisus:不,不是。它更像协同程序——一个完全不同的概念(即在执行过程中暂停/恢复函数)。“延迟”的事实与此无关。