3

我正在call/ccRacket 中按照论文Continuations by example: Exceptions, time-traveling search, generators, threads, and coroutines 1学习。

该论文提到,最有利的 API 是call/cc通过提供一个过程派生而来的lambda (cc) (cc cc)。我理解这个特定call/cc的调用将当前的延续一等对象返回给主程序。

在下面的示例中,本文将所有 this 称为(right-now).

我看到的是,在同一个示例中cc,上述call/cc调用返回的对象总是在之后通过将其应用于自身来运行。这就是我不明白的。

我没有看到 value 有什么特别之处cc,所以我尝试用(cc ()), or (cc (lambda () ())), 甚至(cc "whatever")and来启动它(cc)。没有任何乐趣:显然,延续只需要该应用程序自己才能开始运行。

这是为什么?有什么例子可以清楚地说明运行 cc 的独特性(cc cc)

4

1 回答 1

2

(let ((cc (current-continuation)))
  ...)

的延续(current-continuation)

(lambda (_)
  (let ((cc _))
    ...)

将此称为延续c0

的定义current-continuation是:

(define (current-continuation)
  (call/cc (lambda (cc) (cc cc))))

所以用as 参数call/cc调用:(lambda (cc) (cc cc))c0

  ((lambda (cc) (cc cc)) c0)
= (c0 c0)

插入 c0 的值:

((lambda (_)
   (let ((cc _))
     ...)
 c0)

变成:

   (let ((cc c0))
     ...)

这意味着...标识符内部cc现在绑定到 value c0

如果 (c0 42)发生在...

我们得到:

   (c0 42)
= ((lamdba (_)
     (let ((cc _))
      ...)
   42)
= (let ((cc 42))
     ...)

现在cc绑定到值 42。

该示例使用(procedure? cc)and(future-value? cc)来测试是否cc绑定到延续(如果(procedure? cc)为真)和/或另一个值(这里的未来值是 42)。

所以在:

(define (current-continuation)
  (call/cc (lambda (cc) (cc cc))))

传递给的值(lambda (cc) (cc cc)))是延续。如果我们想要处理它,我们需要返回它,我们通过将它传递给延续来做到这一点。即 (cc something)会返回一些东西,因为我们想要获得延续本身,所以我们使用(cc cc).

于 2015-10-26T21:11:26.860 回答