是否可以使用异步在C#5.0中实现阴阳拼图?

时间:2011-11-08 04:00:53

标签: c# .net asynchronous scheme c#-5.0

在Scheme中实施的谜题如下:

(let* ((yin
     ((lambda (cc) (display #\@) cc) (call-with-current-continuation (lambda (c) c))))
   (yang
     ((lambda (cc) (display #\*) cc) (call-with-current-continuation (lambda (c) c)))))
(yin yang))

这个难题的目标是找出并理解这段代码的输出。

我想知道是否可以使用C#5.0的新异步CPS功能实现具有相同语义的代码。

我难以掌握的部分是,拼图依赖于let *和call / cc的语义。我不确定如何在C#中正确表达这种相互作用。

1 个答案:

答案 0 :(得分:1)

CPS可以完全摆脱call / cc,所以你绝对可以通过手工CPS来实现它。对C#的自动CPS一无所知,我不能说这个功能是否会自动完成。但是,名称中的“异步”让我停下来。您提供的问题与此表达式的同步评估明确相关。

我的观点:我认为将其转换为C#并不是理解这一点的最快方法。

最后:let *是嵌套绑定的简写。所以你可以把它重写为:

(let ([yin ...])
  (let ([yang ...])
     ...))

...摆脱let *。在你的情况下,因为'yang'不依赖于'yin',所以效果就是测序。也就是说,在'yin'绑定的右侧捕获的延续是尚未评估'yang'绑定的延续。