unj*_*nj2 28 scheme continuations functional-programming clojure
我读到富有的hickey说的地方:
"我认为在理论上延续可能是整洁的,但在实践中并非如此"
我不熟悉clojure.
1. clojure有继续吗?
如果不是,你不需要继续吗?我见过很多很好的例子,尤其是这个人.有什么选择?
3.如果是,是否有文件?
Dar*_*rio 27
在谈论延续时,你必须区分它们的两种不同:
一流的延续 - 持续支持,深度集成在语言中(Scheme或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)
Run Code Online (Sandbox Code Playgroud)
; Call
print (double 2)
; Call CPS: Continue execution with specified anonymous function
double 2 (\res -> print res)
Run Code Online (Sandbox Code Playgroud)
阅读维基百科上的续篇.
我不认为延续对于良好的语言是必要的,但尤其是像Haskell这样的函数式语言中的第一类延续和CPS可能非常有用(智能回溯示例).
Nat*_*vis 10
Continuations是一个抽象概念,用于描述控制流语义.在这个意义上,它们既存在又不存在(记住,它们是抽象的)任何提供控制操作符的语言(如任何图灵完整语言必须的那样),就像数字都存在一样(作为抽象实体)和不存在(作为有形实体).
Continuations描述控制效果,例如函数调用/返回,异常处理,甚至是gotos.除其他外,一个完善的语言将设计有基于延续(例如,例外)的抽象.(也就是说,一个有根据的语言将由设计时考虑到延续的控制运算符组成.当然,将语言作为唯一的控件抽象公开,允许用户构建自己的语言是完全合理的.抽象在上面.)
如果延续的概念被物化为一种语言一流的对象,然后我们有一个工具,在其各种控制效果可建.例如,如果一种语言具有一等继承而非异常,我们可以在continuation之上构造异常.
虽然在许多情况下,一流的延续是一个强大而有用的工具,但是用一种语言暴露它们也有一些缺点:
finally
如果我使用continuation中止计算,则可能会跳过一个块.通过元编程,可以为语言添加对一流延续的支持.通常,这种方法涉及将代码转换为连续传递样式(CPS),其中当前延续作为每个函数的显式参数传递.
例如,David Nolen的delimc库通过一系列宏变换实现了Clojure程序部分的分隔连续.与此类似,我创作了pulley.cps,它是一个将代码转换为CPS的宏编译器,以及一个运行时库,支持更多核心Clojure特性(如异常处理)以及与本机Clojure代码互操作.
这种方法的一个问题是如何处理本机(Clojure)代码和转换(CPS)代码之间的边界.具体来说,由于您无法捕获本机代码的延续,您需要禁止(或以某种方式限制)与基本语言的互操作,或者给用户带来负担,确保上下文允许他们希望实际捕获的任何延续被捕获.
尽管已经进行了一些尝试以允许用户管理它,但是滑轮cps倾向于后者.例如,可以禁止CPS代码调用本机代码.此外,提供了一种机制来提供现有本机功能的CPS版本.
在具有足够强类型系统的语言(例如Haskell)中,可以使用类型系统来封装可能使用来自功能纯代码的控制操作(即,延续)的计算.
我们现在拥有直接回答您的三个问题所需的信息:
延迟的一个常见用途是实现控制结构:从函数返回,从循环中断,异常处理等.大多数语言(如Java,C++等)都将这些特性作为核心语言的一部分提供.有些语言没有(例如:Scheme).相反,这些语言将连续性暴露为第一类对象,并让程序员定义新的控制结构.因此,Scheme应该被视为一种编程语言工具包,而不是一种完整的语言本身.
在Clojure中,我们几乎不需要直接使用continuation,因为几乎所有的控制结构都是由语言/ VM组合提供的.仍然,一流的延续可以成为有能力的程序员手中的有力工具.特别是在Scheme中,continuation比其他语言中的等价对应物更好(比如C中的setjmp/longjmp对).该文章对此有更多的细节.
顺便说一句,了解Rich Hickey如何证明他对延续的看法将会很有趣.任何链接?