Racket 如何在球拍中开始捕捉当前连续体
我正在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有什么特别之处,所以我试着用(
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)
。我俯瞰着第一对帕伦夫妇。非常感谢。