【问题标题】:(call/cc): What exactly is continuation?(call/cc): 延续到底是什么?
【发布时间】:2016-01-18 07:06:35
【问题描述】:

这个问题已经在 SO 上被问过好几次了,但没有一个能解决我的问题。 什么是延续?

考虑以下代码:

( (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 函数?这样它就可以一直调用自己

【问题讨论】:

    标签: functional-programming scheme racket continuations


    【解决方案1】:

    我想我已经明白了。

    继续是程序的当前状态

    鉴于此,首先我们需要问:这个程序的延续性或当前状态是什么?

    这是一个等待一对的 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 也是如此(以某种未指定的顺序),然​​后使用 x 的值调用 f 的值,作为函数应用。所以x 的上下文是“使用提供的值调用f”,这是该点的延续。 k 捕获它; cons 将其作为 cons 对的一部分传递。
    • 顺便说一句,这与 CPS 无关。
    猜你喜欢
    • 2017-01-22
    • 2011-02-16
    • 2019-12-30
    • 2016-06-05
    • 2021-10-27
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多