7

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

然而,多年来提出的许多其他控制结构尚未进入现代编程语言。例如,在 Knuth 的论文“使用 Go To 语句进行结构化编程”,第 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 经常使用一种控制结构,在这种结构中,根据一组可能为真的条件,非确定性地执行多段代码中的一段。您可以在他关于 smoothsort 的论文的第 10 页上看到这一点。示例代码可能如下所示:

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 提供的小集合。然而,正如另一个 SO 问题所证明的那样,我们程序员喜欢思考关于我们希望拥有但许多编程语言不支持的替代控制结构。

我的问题是——今天使用的通用语言是否支持与我上面提到的 C 风格控制结构完全不同的控制结构? 这样的控制结构不必是无法使用标准 C 结构表示的东西——几乎任何东西都可以这样编码——但理想情况下,我想要一个可以让你处理某些编程任务的例子与 C 模型所允许的完全不同的方式。

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

4

4 回答 4

2
  • 由于 Haskell 是惰性的,因此每个函数调用本质上都是一个控制结构。
  • ML 派生语言中的模式匹配将分支、变量绑定和解构对象合并到单个控制结构中。
  • Common Lisp 的条件就像可以重新启动的异常。
  • Scheme 和其他语言支持让您在任何时候暂停和恢复或重新启动程序的延续。
于 2011-08-02T01:16:58.380 回答
1

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

异步允许并行执行非阻塞代码,一旦完成,控制权就会返回到主程序流。尽管使用嵌套回调也可以实现相同的效果,但以这种方式做任何不平凡的事情都会导致代码非常糟糕。

例如,在即将发布的 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);
于 2011-07-31T03:34:54.507 回答
1

C#/Python 迭代器/生成器

def integers():
    i = 0
    while True:
        yield i
        i += 1
于 2011-07-31T03:39:56.330 回答
1

(我对这个主题了解不多,所以我将其标记为 wiki)

Haskell 的模式匹配

简单的例子:

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

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

fib x | x < 2       = 1
      | x >= 2      = fib (x - 1) + fib (x - 2)
于 2011-07-31T03:47:02.943 回答