Clojure是否具有延续/协程/等?


20

我开始使用Python进行编程,但对协程和闭包之类的概念确实感到困惑。

现在,我认为我在某种程度上是认识他们的,但是我从来没有感受到过“启蒙”的时刻,所以我选择学习Clojure。我买了斯图尔特·哈洛韦(Stuart Halloway)的书,它很好,但是当我查看索引时,并没有像协程或延续这样的词。我用谷歌搜索,但也没有。

所以,我的问题是:

Clojure是否具有连续性或协程来执行诸如ping应答之类的任务而没有堆栈溢出?

Python示例(尽管标准Python不支持此对称协程的全功能版本):

def ping():
  while 1:
   print "ping"
   function to switching to pong

def pong():
  while 1:
   function to switching to ping
   print "pong"

Answers:


20

Clojure没有通话/抄送,但您还是不希望无限制的继续

我们反对将其call/cc作为核心语言功能,将其作为独特的控制操作来实现,从而将所有其他功能本地降级为库。该原语call/cc是一个糟糕的抽象 -如下所示“坏”的各种含义-并且捕获整个程序的延续实际上没有用。有效地捕获整个连续性的辛勤工作的唯一回报是,要克服捕获整个连续性的辛苦工作。一组经过精心选择的,具有广泛通用性的,经过深思熟虑的交互操作的控制原语,可以为用户和实现者提供更好的服务...

... call/cc作为一项核心控制功能,应实施所有其他控制功能,这是一个坏主意。性能,内存和资源泄漏,易于实现,易于使用,易于推理都与反对call/cc。如果确实有一个杰出的控制功能可以实现为原语,而其他功能则归入库,则不是call/cc

David Nolen 为Clojure 写了定界的延续库。试试看!

倾斜

带分隔符的Clojure 1.4.0(和1.3.0)延续库。基于Slava Akhmechet(http://defmacro.org)的cl-cont的部分...


2

尽管Clojure没有内置的一流延续或协程作为核心功能,但是可以实现自己的。

例如,core.async是一个Clojure库,它实现了CSP(并发顺序过程)模型。它使用go宏将其中的代码转换为状态机。虽然本身并不完全是协程,但可以用来实现相同的模式。

还有pulley.cps,宏编译器,我创作的是变换(经cps/ cps-fn写在直接的风格宏)Clojure的代码为延续传递风格。据我所知,这是最完整的以延续为主题的Clojure程序。它支持动态绑定,异常,在本机代码与转换后的代码之间来回调用(尽管不跨上下文维护连续性)。目前,仅支持堕胎式延续(即传统式call-cc),但我确实有计划在将来实施定界式延续。

虽然roller.cps本身并不直接提供协程,call-cc但它可以直接实现您自己的协程。实际上,示例之一是协作多任务的简单实现。这将在CSP示例中进一步构建。还有一个Ping-Pong示例,但它比协程更像是尾部调用优化的示例。

当然,当将这些转换应用于整个程序时,它们是最有效的。不幸的是,仅使用本地化的宏是不可能的。但是,即使是局部转换也可能非常有效。


1

Clojure是否具有连续性或协程来执行诸如ping应答之类的任务而没有堆栈溢出?

一个老问题,所以我什至不确定当时是否可以使用此功能,但是对于任何想要实现任何形式的“乒乓”功能的人,请查看蹦床

我刚刚发现它是我对Clojure中有效的Continuation-Passing Style问题的答案,请访问:https : //stackoverflow.com/questions/50952443/continuation-passing-style-does-not-seem-to-make-a -difference-in-clojure / 50955276#50955276 ,我认为这只是工作。我前一段时间听说过,但从未进行全面调查。更愚弄我。与其他许多提议的解决方案不同,它可以正常工作

====== PS。在线提供了大量教程信息,]以下是我发现有用的一些信息


1
也许链接蹦床指向文档?
esoterik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.