这个问题曾多次被问过,但没有一个能解决我的问题。 什么是延续?
请考虑以下代码:
( (lambda (pair)
(begin (print (car pair))
((cdr pair) (cons (+ 1 (car pair))
(cdr pair)))))
(call/cc (lambda (k)
(cons 0 k))))
该程序无限期地循环打印整数序列 从0开始。
我的理解是:
第1步:评估(call/cc (lambda (k) (cons 0 k)))
,返回对(0 . #continuation)
(此处#continuation
是什么)
步骤2:将步骤1中的对应用于lambda函数。 lambda函数首先打印出car
,即0。
现在,我完全迷失了。该计划正在评估(#continuation (1 . #continuation))
,这对我来说并没有多大意义。 #continuation
现在是一个程序吗?
是什么让程序继续将(call/cc (lambda (k) (cons 0 k)))
应用于lambda函数?这样它就可以继续自称
答案 0 :(得分:3)
我想我已经明白了。
延续是该计划的当前状态
鉴于此,首先我们需要问:该计划的延续或当前状态是什么?
这是一个等待一对的lambda函数。
#continuation = ( lambda-function <placeholder>)
<placeholder>
将是我们传递给lambda函数的任何东西,但我们还没有这样做。
现在我们的程序开始运行,它评估lambda函数,然后它通过call / cc评估对返回,(0 . #continuation)
。
(print (car pair))
=&gt;接下来,lambda函数打印出0
((cdr pair) (cons (+ 1 (car pair)) (cdr pair)))))
=&gt;在这里,(cdr pair)
是我们的continuation
,即(lambda-function <placeholder>)
,然后我们的程序会将新对传递给它。然后程序开始无限循环