我们能否将Clojure的core.async描述为“延续传递风格”?

时间:2013-12-30 21:35:51

标签: clojure continuations goroutine callcc core.async

在Clojure的core.async library中,我们看到一个macro that creates a state machine包围go个块来创建处理阻塞IO的通道。

这似乎是modelling on C#'s async and on Go-lang's goroutines

Seasoned Schemer中,他们描述了techniques for passing continuations。 (这似乎是based on call/cc)。我们还在Clojure的David Nolen上看到delimited continuations的图书馆。

Here they describe C#'s async为“call with current continuation”。

我的问题是我们可以将Clojure的core.async描述为“continuation passing style”吗?

或者是'延续'(delimited and undelimited)一个超载的术语?


编辑: 另外需要注意 - David Nolen has said wrt to core.async:

  

在go块的内部,它给你的幻觉是你可以以同步方式完成这些事情,这样你就不必手动以连续传递方式编写代码。

2 个答案:

答案 0 :(得分:11)

我在这里看到两个问题:

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

  2. core.async的内部是否与CPS相关?

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

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

答案 1 :(得分:2)

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

Tim Baldridge在这里有两个关于go宏实现的视频。要注意:总共两个小时,他详细介绍了state machine如何实施以及如何运作。

Core Async Go Macro Internals - Part I

Core Async Go Macro Internals - Part 2

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

Deep Walking Macros