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和其他语言支持在任何时候暂停、恢复或重新启动程序
var found=false
编写循环时,我总是觉得太冗长@波洛克:啊,我明白了。。。奇怪,哈哈。这很像懒惰的评估。例如,在Haskell中:取2[1,2,3,4]
->[1,2]
@Radagaisus:不,不是。它更像协同程序——一个完全不同的概念(即在执行过程中暂停/恢复函数)。“延迟”的事实与此无关。