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

时间:2011-07-31 03:04:45

标签: programming-languages control-structure structured-programming

结构化编程语言通常有一些控制结构,如whileiffordoswitchbreak,和continue用于表示源代码中的高级结构。

然而,多年来提出的许多其他控制结构尚未进入现代编程语言。例如,在Knuth的论文“Structured Programming with Go To Statements”第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经常使用一种控制结构,其中许多代码之一基于可能为真的一组条件而不确定地执行。您可以在其他地方看到此on page 10 of his paper on smoothsort。示例代码可能如下所示:

do
    /* Either of these may be chosen if x == 5 */
    if x <= 5 then y = 5;
    if x >= 5 then y = 137; 
od;

据我所知,历史上C影响了许多现代语言,如C ++,C#和Java,我们今天使用的控制结构很多都基于C提供的小集。但是,as evidenced by this other SO question,我们程序员喜欢考虑我们喜欢的替代控制结构,但很多编程语言都不支持。

我的问题是 - 目前使用的常用语言是否支持与上面提到的C风格控制结构完全不同的控制结构?这样的控制结构不一定是某种东西无法使用标准C结构表示 - 几乎任何东西都可以通过这种方式进行编码 - 但理想情况下,我想要一些能让您以与C模型允许的方式完全不同的方式处理某些编程任务的示例。 / p>

不,“功能编程”并不是真正的控制结构。

4 个答案:

答案 0 :(得分:2)

  • 由于Haskell是lazy每个函数调用本质上都是一个控制结构。
  • ML派生语言中的
  • Pattern-matching将分支,变量绑定和解构对象合并为单个控制结构。
  • Common Lisp的conditions就像可以重新启动的异常一样。
  • 方案和其他语言支持continuations,可让您随时暂停和恢复或重新启动程序。

答案 1 :(得分:1)

也许不是“根本不同”,但“异步”控制结构是相当新的。

Async允许并行执行非阻塞代码,控制在完成后返回主程序流程。尽管使用嵌套回调可以实现同样的目的,但以这种方式执行任何非常重要的操作都会导致代码变得非常快。

例如,在即将推出的C#/ VB版本中,Async允许调用异步API而无需在多个方法或lambda表达式之间拆分代码。即没有更多的回调。 “await”和“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;
}

(从http://blogs.msdn.com/b/visualstudio/archive/2011/04/13/async-ctp-refresh.aspx收缩)

对于Javascript,有http://tamejs.org/允许您编写如下代码:

var res1, res2;
await {
    doOneThing(defer(res1));
    andAnother(defer(res2));
}
thenDoSomethingWith(res1, res2);

答案 2 :(得分:1)

C#/ Python迭代器/生成器

def integers():
    i = 0
    while True:
        yield i
        i += 1

答案 3 :(得分:1)

(我不太了解这个主题所以我把它标记为维基)

<强> Haskell's Pattern Matching

简单的例子:

sign x |  x >  0        =   1
       |  x == 0        =   0
       |  x <  0        =  -1

或者说,斐波纳契,看起来几乎与数学方程相同:

fib x | x < 2       = 1
      | x >= 2      = fib (x - 1) + fib (x - 2)