Racket 如何在球拍中开始捕捉当前连续体

Racket 如何在球拍中开始捕捉当前连续体,racket,continuations,callcc,Racket,Continuations,Callcc,我正在Racket中学习call/cc,通过示例沿着纸张的连续线学习:异常、时间旅行搜索、生成器、线程和协同程序 本文提到,最有利的API来自call/cc,它提供了一个过程lambda(cc)(cc-cc)。我理解这个特定的call/cc调用将当前的continuation一级对象返回给主程序 在下面的示例中,本文调用所有这些(现在) 我看到的是,在同一个示例中,上面提到的call/cc调用返回的cc对象始终通过将其应用于自身来运行。这就是我不明白的 我看不出cc有什么特别之处,所以我试着用(

我正在Racket中学习
call/cc
,通过示例沿着纸张的连续线学习:异常、时间旅行搜索、生成器、线程和协同程序

本文提到,最有利的API来自
call/cc
,它提供了一个过程
lambda(cc)(cc-cc)
。我理解这个特定的
call/cc
调用将当前的continuation一级对象返回给主程序

在下面的示例中,本文调用所有这些
(现在)

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

我看不出
cc
有什么特别之处,所以我试着用
(cc())
,或者
(cc(lambda())
,甚至
(cc“whatever”)
(cc)
,来启动它。毫无乐趣可言:显然,续集只想让应用程序自己开始运行

为什么呢?通过在中执行
(cc-cc)

可以清楚地说明运行cc的唯一性的示例是什么

(let ((cc (current-continuation)))
  ...)
(当前延续)
的延续是

(lambda (_)
  (let ((cc _))
    ...)
将此继续调用
c0

当前延续的定义是:

(define (current-continuation)
  (call/cc (lambda (cc) (cc cc))))
所以
call/cc
调用
(lambda(cc)(cc-cc))
,并将
c0
作为参数:

  ((lambda (cc) (cc cc)) c0)
= (c0 c0)
插入c0的值:

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

   (let ((cc c0))
     ...)
这意味着在
内部,标识符
cc
现在绑定到值
c0

如果
(c0 42)
出现在

我们得到的结果是:

   (c0 42)
= ((lamdba (_)
     (let ((cc _))
      ...)
   42)
= (let ((cc 42))
     ...)
现在,
cc
与值42绑定

该示例使用
(过程?cc)
(未来值?cc)
来测试
cc
是否绑定到延续(如果
(过程?cc)
为真)或另一个值(未来值在此为42)

因此:

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

传递给
(lambda(cc)(cc))
的值是连续值。如果我们想要得到它,我们需要将它返回,并通过将它传递给续集来实现。也就是说,
(cc something)
将返回一些内容,由于我们希望获得延续本身,因此我们使用
(cc cc)

顺便说一句-请注意,空应用程序
()
是Racket中的一个错误。试试类似于
(cc 42)
。我也试过:-(文本现在已修改:-)这就是线索<代码>(当前继续)=(调用/cc)
。我俯瞰着第一对帕伦夫妇。非常感谢。