Clojure中延续(Continuations in Clojure)

2019-07-30 16:35发布

我读的地方,其中丰富的吻痕说:

“我想延续可能是在理论上整洁,但在实践中没有”

我不熟悉的Clojure。
1.是否有Clojure的延续?
2.如果没有,也不需要延续? 我已经看到了很多很好的例子尤其是这家伙 。 什么是另类?
3.如果是的话,是否有一个文档?

Answer 1:

在谈到延续,你将有两种不同类型的人来区分:

  • 一流的延续 - 这是深深集成在语言(计划或Ruby)继续支持。 Clojure的不支持一流的延续。

  • 延续传递风格(CPS) - CPS只是一个编码和支持匿名函数可以让这种风格(适用于Clojure的太)任何语言的风格。

例子:

-- Standard function
double :: Int -> Int
double x = 2 * x

-- CPS-function – We pass the continuation explicitly
doubleCPS :: Int -> (Int -> res) -> res
doubleCPS x cont = cont (2 * x)
; Call
print (double 2)

; Call CPS: Continue execution with specified anonymous function
double 2 (\res -> print res)

阅读延续维基百科。

我不认为延续所必需的良好的语言,尤其是一流的延续和CPS像Haskell的函数式语言是非常有用的( 智能回溯例子 )。



Answer 2:

我已经写了CL-CONT的Clojure的端口,增加了延续到Common Lisp的。

https://github.com/swannodette/delimc



Answer 3:

是继续在语言的必要功能?

语言数目大量没有延续。

如果没有,不要你需要延续? 我已经看到了很多很好的例子尤其是这家伙。 什么是另类?

调用堆栈



Answer 4:

摘要延续

延续是用于描述控制流语义的抽象概念。 在这个意义上,它们都存在,不存在(请记住,他们是抽象的),因为提供了控制操作(如任何图灵完备必须语言)任何一种语言,以同样的方式,数量都存在(作为抽象实体)和不存在(如有形的实体)。

延续描述的控制效果,如函数调用/返回,异常处理,甚至goto的。 一个精心创办的语言会,除其他事项外,被设计为与上构建的延续(例如,异常)的抽象。 (也就是说,有根有据的语言将包括在设计时考虑到延续的是控制运营商,这是当然的,非常合理的语言揭露延续作为唯一控制的抽象,允许用户建立自己的在上面的抽象。)

一流的延续

如果延续的概念被物化为一种语言一流的对象,然后我们有一个工具,在其各种控制效果可建。 例如,如果一种语言具有一流的延续,而不是例外,我们可以构建在延续的顶部例外。

凭借一流的延续问题

虽然一流的延续在许多情况下,一个强大的和有用的工具,也有一些缺点的语言揭露他们:

  • 由当建立在延续的顶部不同的抽象可能会导致意外/非直观的行为。 例如, finally块可能如果我使用一个延续中止计算被跳过。
  • 如果当前的延续可在任何时间被请求,则该语言运行时必须被构造成使得它能够在任何时间,以产生当前的延续的一些数据结构表示。 这个地方一定程度上运行时的负担为此,是好还是坏,常常被认为是“性趣”的特点。 如果语言托管(如Clojure是在JVM上托管),那么这表示必须能够适应由主机平台提供的框架内。 还可以有其他特征的语言想维持(例如,C互操作),该限制解空间。 诸如这些问题,增大“阻抗不匹配”的潜力,并可能严重复杂化高性能解决方案的发展。

加一等延续到语言

通过元编程,可以为一流的延续支持添加到语言。 一般来说,这种方法包括把代码延续传递风格(CPS),在当前的延续是通过周围作为一个明确参数给每个功能。

例如,大卫诺伦的delimc库实现通过一系列宏变换限定的Clojure的程序的各部分的延续。 与此类似,我已经撰写pulley.cps ,这是一个宏观的编译器转换代码到CPS,具有运行时库,以支持多个核心的Clojure特性(如异常处理)一起,以及与本地的Clojure代码互操作。

这种方法的一个问题是,你如何处理原生(Clojure的)代码和转化(CPS)的代码之间的边界。 特别是,因为你无法捕捉的本地代码的延续,你需要或者禁止(或在某种程度上限制)互操作与基础语言或将在保证范围内,用户的负担会允许任何延续他们希望捕捉到实际被捕获。

pulley.cps趋向于后者,虽然有些已经尝试允许用户管理这一点。 例如,它可以禁止CPS代码调用本机代码。 另外,提供了一种机制,以供应现有的本地功能CPS版本。

在具有足够强的类型的系统(诸如Haskell的)一种语言,它可以使用的类型系统来封装,其可能使用的控制操作(即,延续)从功能上纯码计算。

摘要

我们现在必须直接回答你的三个问题所需的信息:

  1. Clojure的不支持,由于实际的考虑一流的延续。
  2. 所有的语言都建立在延续的理论意义,但很少有语言暴露延续作为第一类对象。 然而,有可能延续添加到通过,例如,转换任何语言到CPS。
  3. 检查出的文档delimc和/或pulley.cps 。


Answer 5:

延续的一个常见的用途是控制结构的实施:从函数返回,从开断,异常处理等大多数语言(如Java,C ++等)提供这些功能为核心语言的一部分。 有些语言不这样(例如:计划)。 相反,这些语言具有continuatiions作为第一类对象,让程序员定义新的控制结构。 因此,方案应作为一种编程语言工具,它本身并不是一个完整的语言来看待时。

在Clojure中,我们几乎从来没有需要直接使用延续,因为被语言/ VM组合提供几乎所有的控制结构。 尽管如此,一流的延续可以在有能力的程序员手中的有力工具。 特别是在方案,延续比在其他语言的等效同行(如在C的setjmp / longjmp的对)更好。 该文章对此有更多的细节。

顺便说一句,这将是有趣知道富希基如何证明他对延续的意见。 对于任何链接?



Answer 6:

Clojure的(或者更确切地说clojure.contrib.monads )具有延续单子; 这里的描述它的使用和激励的文章 。



Answer 7:

嗯... Clojure的->实现你所追求的......但是,随着宏代替



文章来源: Continuations in Clojure