【问题标题】:Is it possible to implement the Yin-Yang puzzle in C# 5.0 using async?是否可以使用异步在 C# 5.0 中实现阴阳谜题?
【发布时间】:2011-11-08 04:00:52
【问题描述】:

在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# 中正确表达这种相互作用。

【问题讨论】:

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


【解决方案1】:

CPS 可以完全摆脱 call/cc,因此您绝对可以通过手动 CPS-ing 在 C# 中实现这一点。对 C# 的自动 CPS-ing 一无所知,我不能说该功能是否会自动执行此操作。但是,名称中的“异步”让我停下来。您提出的问题与此表达式的 同步 评估明确相关。

我的观点:我认为将其翻译成 C# 并不是理解这一点的最快方式。

最后:let* 是嵌套绑定的简写。因此,您可以将其重写为:

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

... 摆脱 let*.在您的情况下,由于“阳”不依赖于“阴”,因此效果就是排序的效果。也就是说,在 'yin' 绑定右侧捕获的延续是尚未评估 'yang' 绑定的延续。

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 2012-03-04
    • 2010-09-20
    • 2013-11-26
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    相关资源
    最近更新 更多