在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块的内部,它给你的幻觉是你可以以同步方式完成这些事情,这样你就不必手动以连续传递方式编写代码。
答案 0 :(得分:11)
我在这里看到两个问题:
使用core.async进行编程是否类似于继续传递样式的编程?
core.async的内部是否与CPS相关?
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
还有一个宏的先决条件视频