关于函数式编程:(call / cc):延续到底是什么?

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