8

在 Clojure 的core.async 库中,我们看到一个宏,它创建一个状态机,该状态机环绕go块以创建处理阻塞 IO 的通道。

这似乎是在C#Go-lang 的 goroutines上建模async

在 The Seasoned Schemer中,他们描述了传递延续的技术。(这似乎基于 call/cc)。我们还看到了来自David Nolen的关于Clojure中分隔延续的库。

在这里,他们将 C# 描述async为 ' call with current continuation '。

我的问题是我们可以将 Clojure 的 core.async 描述为“延续传递风格”吗?

还是“延续”(定界和未定界)是一个超载的术语?


编辑:另外说明 - David Nolen对 core.async 说过:

在 go 块内部,它给您一种错觉,即您可以以同步的方式执行这些操作,因此您不必手动以连续传递样式编写代码。

4

2 回答 2

11

我在这里看到两个问题:

  1. 使用 core.async 进行编程是否类似于继续传递风格的编程?

  2. core.async 的内部结构与 CPS 相关吗?

1. 的答案是“否”,因为没有明确的延续。事实上,这就是重点。使用 core.async 的主要原因之一是逃避回调地狱,这基本上是 CPS 坏了(回调是延续)。

2. 的简单答案也是“否”,因为go宏使用SSA内部表示来生成状态机。然而,SSA 和 CPS 确实是相关的,因为它们用于相似的目的(即,作为编译器中的内部表示;它们在表面上感觉不同并且在语义上并不完全等效,但在实现类似核心的东西时.async 原则上您可以使用其中任何一个)。

于 2013-12-30T23:09:55.253 回答
2

从某种意义上说,就是CPS,但实现更像是goto到处链接的代码块。

Tim Baldridge 在这里有两个视频讨论 go 宏的实现。当心:总共是两个小时,他详细介绍了如何state machine实施以及如何工作。

核心异步 Go 宏内部 - 第一部分

核心异步 Go 宏内部 - 第 2 部分

还有一个宏的先决条件视频

深度行走宏

于 2013-12-30T22:30:37.977 回答