(电话/ cc):究竟什么是延续?

时间:2015-10-19 19:57:27

标签: functional-programming scheme racket continuations

这个问题曾多次被问过,但没有一个能解决我的问题。 什么是延续?

请考虑以下代码:

( (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函数?这样它就可以继续自称

1 个答案:

答案 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>),然后我们的程序会将新对传递给它。然后程序开始无限循环