(call/cc): What exactly is continuation?
这个问题已经在SO上问过好几次了,但是没有一个人解决了我的问题。什么是延续?
考虑以下代码:
1 2 3 4 5 6 7
| ( (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函数?这样它就可以继续自称
我想我已经弄清楚了。
继续是程序的当前状态
鉴于此,首先我们要问:程序的延续是什么,还是当前状态?
这是一个等待对的lambda函数。
#continuation = ( lambda-function <placeholder>)
<placeholder>将是我们将要传递给该lambda函数的函数,但我们尚未这样做。
现在我们的程序开始运行,它先评估lambda函数,然后再通过call / cc((0 . #continuation))评估对返回。
(print (car pair)) =>接下来,lambda函数打印出0
((cdr pair) (cons (+ 1 (car pair)) (cdr pair))))) =>在这里,(cdr pair)是我们的continuation,它是(lambda-function <placeholder>),然后我们的程序将一对新的对传递给它。然后程序开始其无限循环
- 你说对了。在Scheme中评估( f x )意味着评估f以找到其值,对x相同(以某些未指定的顺序),然??后将f的值与x的值一起调用应用。因此,x的上下文是"使用提供的值调用f",这是该点的继续。 k捕获它; cons将其作为cons对的一部分传递。
-
顺便说一句,这与CPS无关。