functional-programming - (调用/抄送): What exactly is continuation?

标签 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 函数?这样它就可以不断地调用自己

最佳答案

我想我已经明白了。

Continuation 是程序的当前状态

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

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

关于functional-programming - (调用/抄送): What exactly is continuation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33222821/

相关文章:

list - 我如何在 Dr. Racket 中编写一个函数,它使用 2 个可能的符号列表并将它们替换为其他符号?

Javascript:使用函数上下文与作为参数传递有什么好处

recursion - 为什么 foldl 在 Racket 中以一种奇怪的方式定义?

scheme - foldl 和 foldr 如何工作,在一个例子中分解?

scheme - Chicken计划中的图书馆单元是什么?

racket - 如何链接到程序的 Scribble 文档中的别名?

列表差异函数

scala - 为什么这个 lambda 函数不能与 Scala 中的 `_` 一起使用?

scheme - 导入模块的方案语法是什么(尤其是诡计)?

在方案中列出作为参数