我们能将Clojure的core.async描述为"延续传递风格"吗?

8
在Clojure的core.async库中,我们看到一个宏,它创建了一个状态机,用于包装go块以创建处理阻塞IO的通道。
这似乎是模仿 C#的async Go语言的goroutines

老练的阴谋家中,他们描述了传递延续的技术。(这似乎是基于call/cc的)。我们还看到了David Nolen在Clojure上关于限定延续的库。

在这里,他们将C#的async描述为“带有当前延续的调用”

我的问题是,我们能否将Clojure的core.async描述为“延续传递风格”?或者,“延续”(有界和无界)是一个重载的术语吗?

编辑: 还有一个额外的注释 - David Nolen曾经说过 关于core.async:

在go块内部,它会给你一种假象,让你觉得可以以同步的方式完成这些操作,从而不必手动以continuation-passing style方式编写代码。

2个回答

11

我看到两个问题:

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

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

对于问题1的答案是“不”,因为没有显式的continuations。实际上,这正是关键所在;使用core.async的主要原因之一是摆脱回调地狱,这基本上就是CPS失控(回调即continuations)。

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


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接