我读了里奇·希基(Rich Hickey)说的地方:

“我认为从理论上讲,连续性可能是整洁的,但在实践中却不是整洁”

我对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)

延续 在维基百科。

我认为对良好语言的连续性不是必需的,但是尤其是像Haskell这样的功能性语言中的一流的连续性和CP可以很有用(智能回溯示例).

其他提示

我已经写了一个Clojure Cl-Cont端口,该端口为普通LISP添加了连续性。

https://github.com/swannodette/delimc

延续是语言中必要的功能吗?

不。大量语言没有延续。

如果没有,您不需要连续吗?我已经看到很多好例子,尤其是这个人。什么是选择?

通话堆栈

抽象的连续性

连续性是用于描述控制流语义学的抽象概念。从这个意义上讲,它们既存在又不存在(请记住,它们是抽象的),以提供控制操作员的任何语言(如任何图灵完整的语言必须),就像数字存在(作为抽象实体)和不存在(作为切实实体)。

连续性描述了控制效果,例如函数呼叫/返回,异常处理甚至GOTO。除其他外,一个良好的语言将以基于连续性建立的抽象设计(例如,例外)。 (也就是说,有充分根据的语言将由设计的控制运算符组成,这些操作员的设计是持续的。 只要 控制抽象,使用户可以在顶部构建自己的抽象。)

一流的延续

如果延续的概念是 修复 作为一种语言的一流对象,我们有了一个工具,可以构建各种控制效果。例如,如果一种语言具有一流的连续性,但没有例外,我们可以在连续性的基础上构建异常。

一流延续问题

尽管在许多情况下,一流的连续性是一种强大而有用的工具,但也有一些缺点可以使它们以一种语言暴露:

  • 在延续之上构建的不同抽象可能会导致组成时出乎意料 /不直觉的行为。例如, finally 如果我使用延续来中止计算,则可能会跳过块。
  • 如果可以随时请求当前的延续,则必须对语言运行时间进行构造,以便可以随时生成一些当前延续的数据结构表示。这给运行时带来了一定程度的负担,因为无论好坏,它通常被认为是“异国情调”。如果该语言是托管的(例如,在JVM上托管了Clojure),则该表示形式必须能够适合托管平台提供的框架。语言也希望维护的其他功能(例如,c Interop)限制了解决方案空间。诸如此类的问题增加了“阻碍不匹配”的潜力,并可能严重使表现剂解决方案的发展变得复杂。

将一流的延续添加到一种语言中

通过元编程,可以将对一流的连续性的支持添加到一种语言中。通常,这种方法涉及将代码转换为延续流式风格(CPS),其中当前延续被作为向每个函数的明确参数传递。

例如,大卫·诺伦(David Nolen) DELIMC 图书馆通过一系列宏变换实现了Clojure程序的部分延续。同样,我也写过 皮带轮, 这是一个宏观编译器,将代码转换为CPS,以及运行时库,以支持更多的核心Clojure功能(例如异常处理)以及与本机Clojure代码互动。

这种方法的一个问题是如何处理本机(Clojure)代码和转换(CPS)代码之间的边界。具体而言,由于您无法捕获本机代码的延续,因此您需要禁止(或以某种方式限制)与基本语言互动或在用户身上施加负担,以确保上下文将允许他们希望捕获的任何延续被捕获。

Pulley.cps倾向于后者,尽管已经尝试了一些尝试使用户管理此操作。例如,可以禁止CPS代码拨打本机代码。此外,还提供了提供现有本机功能的CPS版本的机制。

在具有足够强类型系统(例如Haskell)的语言中,可以使用类型系统封装可能使用功能纯代码的控制操作(即,连续)的计算。

概括

现在,我们有必要的信息直接回答您的三个问题:

  1. Clojure不支持由于实际考虑而支持一流的延续。
  2. 所有语言都是基于理论意义上的连续性建立的,但是很少有语言将连续性作为一流的对象公开。但是,可以通过通过任何语言将连续性添加到CPS中。
  3. 查看文档 DELIMC 和/或 皮带轮.

连续性的普遍用途是实施控制结构:从函数返回,从循环中折断,异常处理等。大多数语言(例如Java,C ++等)提供这些功能作为核心语言的一部分。有些语言没有(例如:方案)。取而代之的是,这些语言将连续性作为头等对象公开,并让程序员定义新的控制结构。因此,方案应被视为一种编程语言工具包,而不是本身就是完整的语言。

在Clojure中,我们几乎不需要直接使用连续性,因为几乎所有的控制结构都是由语言/VM组合提供的。尽管如此,头等舱的连续性还是可以在主管程序员手中成为强大的工具。尤其是在方案中,连续性比其他语言中的等效对应物更好(例如C中的setJMP/longJMP对)。 这个 文章对此有更多详细信息。

顺便说一句,知道富人对他对延续的看法有何辩解将很有趣。有什么链接吗?

clojure(或更确切地说 clojure.contrib.monads)有一个延续的单子; 这是一篇描述其用法和动力的文章.

好吧... Clojure的 -> 实现您追求的东西...但是用宏来实现

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top