在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#中正确表达这种相互作用。
答案 0 :(得分:1)
CPS可以完全摆脱call / cc,所以你绝对可以通过手工CPS来实现它。对C#的自动CPS一无所知,我不能说这个功能是否会自动完成。但是,名称中的“异步”让我停下来。您提供的问题与此表达式的同步评估明确相关。
我的观点:我认为将其转换为C#并不是理解这一点的最快方法。
最后:let *是嵌套绑定的简写。所以你可以把它重写为:
(let ([yin ...])
(let ([yang ...])
...))
...摆脱let *。在你的情况下,因为'yang'不依赖于'yin',所以效果就是测序。也就是说,在'yin'绑定的右侧捕获的延续是尚未评估'yang'绑定的延续。