在Clojure的core.async库中,我们看到一个宏,它创建一个状态机,它围绕go
块来创建处理阻塞IO的通道.
这似乎是在 C#async
和 Go-lang的goroutines 上进行建模.
在The Seasoned Schemer中 - 他们描述了传递延续的技巧.(这似乎是基于电话/ cc).我们还看到了David Nolen的一个图书馆在Clojure 上的分隔延续.
在这里,他们将C#描述async
为" 当前延续的呼叫 ".
我的问题是我们可以将Clojure的core.async描述为" 延续传递风格 "吗?
或者是'延续'(分隔和无限制)一个超载的术语?
编辑:另外一点 - 大卫·诺伦已经说过核心.async:
在一个go块中,它给你一种错觉,你可以以同步的方式做这些事情,这样你就不必手动以连续传递方式编写代码.
Michał Marcz.. 11
我在这里看到两个问题:
使用core.async进行编程是否类似于继续传递样式的编程?
core.async的内部是否与CPS相关?
1.的答案是"不",因为没有明确的延续.事实上,这是重点; 使用core.async的一个主要原因是逃避回调地狱,这基本上是CPS变坏(回调是延续).
对2.的简单回答也是"否",因为go
宏使用SSA内部表示来生成状态机.然而,确实SSA和CPS是相关的,因为它们用于类似的目的(即,作为编译器中的内部表示;它们在表面上感觉不同并且在语义上不完全等同,但是在实现类似核心的东西时.async你原则上可以使用其中之一).
我在这里看到两个问题:
使用core.async进行编程是否类似于继续传递样式的编程?
core.async的内部是否与CPS相关?
1.的答案是"不",因为没有明确的延续.事实上,这是重点; 使用core.async的一个主要原因是逃避回调地狱,这基本上是CPS变坏(回调是延续).
对2.的简单回答也是"否",因为go
宏使用SSA内部表示来生成状态机.然而,确实SSA和CPS是相关的,因为它们用于类似的目的(即,作为编译器中的内部表示;它们在表面上感觉不同并且在语义上不完全等同,但是在实现类似核心的东西时.async你原则上可以使用其中之一).