我读的地方,其中丰富的吻痕说:
“我想延续可能是在理论上整洁,但在实践中没有”
我不熟悉的Clojure。
1.是否有Clojure的延续?
2.如果没有,也不需要延续? 我已经看到了很多很好的例子尤其是这家伙 。 什么是另类?
3.如果是的话,是否有一个文档?
我读的地方,其中丰富的吻痕说:
“我想延续可能是在理论上整洁,但在实践中没有”
我不熟悉的Clojure。
1.是否有Clojure的延续?
2.如果没有,也不需要延续? 我已经看到了很多很好的例子尤其是这家伙 。 什么是另类?
3.如果是的话,是否有一个文档?
在谈到延续,你将有两种不同类型的人来区分:
一流的延续 - 这是深深集成在语言(计划或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的函数式语言是非常有用的( 智能回溯例子 )。
我已经写了CL-CONT的Clojure的端口,增加了延续到Common Lisp的。
https://github.com/swannodette/delimc
是继续在语言的必要功能?
语言数目大量没有延续。
如果没有,不要你需要延续? 我已经看到了很多很好的例子尤其是这家伙。 什么是另类?
调用堆栈
延续是用于描述控制流语义的抽象概念。 在这个意义上,它们都存在,不存在(请记住,他们是抽象的),因为提供了控制操作(如任何图灵完备必须语言)任何一种语言,以同样的方式,数量都存在(作为抽象实体)和不存在(如有形的实体)。
延续描述的控制效果,如函数调用/返回,异常处理,甚至goto的。 一个精心创办的语言会,除其他事项外,被设计为与上构建的延续(例如,异常)的抽象。 (也就是说,有根有据的语言将包括在设计时考虑到延续的是控制运营商,这是当然的,非常合理的语言揭露延续作为唯一控制的抽象,允许用户建立自己的在上面的抽象。)
如果延续的概念被物化为一种语言一流的对象,然后我们有一个工具,在其各种控制效果可建。 例如,如果一种语言具有一流的延续,而不是例外,我们可以构建在延续的顶部例外。
虽然一流的延续在许多情况下,一个强大的和有用的工具,也有一些缺点的语言揭露他们:
finally
块可能如果我使用一个延续中止计算被跳过。 通过元编程,可以为一流的延续支持添加到语言。 一般来说,这种方法包括把代码延续传递风格(CPS),在当前的延续是通过周围作为一个明确参数给每个功能。
例如,大卫诺伦的delimc库实现通过一系列宏变换限定的Clojure的程序的各部分的延续。 与此类似,我已经撰写pulley.cps ,这是一个宏观的编译器转换代码到CPS,具有运行时库,以支持多个核心的Clojure特性(如异常处理)一起,以及与本地的Clojure代码互操作。
这种方法的一个问题是,你如何处理原生(Clojure的)代码和转化(CPS)的代码之间的边界。 特别是,因为你无法捕捉的本地代码的延续,你需要或者禁止(或在某种程度上限制)互操作与基础语言或将在保证范围内,用户的负担会允许任何延续他们希望捕捉到实际被捕获。
pulley.cps趋向于后者,虽然有些已经尝试允许用户管理这一点。 例如,它可以禁止CPS代码调用本机代码。 另外,提供了一种机制,以供应现有的本地功能CPS版本。
在具有足够强的类型的系统(诸如Haskell的)一种语言,它可以使用的类型系统来封装,其可能使用的控制操作(即,延续)从功能上纯码计算。
我们现在必须直接回答你的三个问题所需的信息:
延续的一个常见的用途是控制结构的实施:从函数返回,从开断,异常处理等大多数语言(如Java,C ++等)提供这些功能为核心语言的一部分。 有些语言不这样(例如:计划)。 相反,这些语言具有continuatiions作为第一类对象,让程序员定义新的控制结构。 因此,方案应作为一种编程语言工具,它本身并不是一个完整的语言来看待时。
在Clojure中,我们几乎从来没有需要直接使用延续,因为被语言/ VM组合提供几乎所有的控制结构。 尽管如此,一流的延续可以在有能力的程序员手中的有力工具。 特别是在方案,延续比在其他语言的等效同行(如在C的setjmp / longjmp的对)更好。 该文章对此有更多的细节。
顺便说一句,这将是有趣知道富希基如何证明他对延续的意见。 对于任何链接?
Clojure的(或者更确切地说clojure.contrib.monads
)具有延续单子; 这里的描述它的使用和激励的文章 。
嗯... Clojure的->
实现你所追求的......但是,随着宏代替