我正在学习延续,但我无法理解这段代码。为什么会进入无限循环?

(let ((cont #f))
  (call/cc (lambda (k)
             (set! cont k)))
  (cont #f))

最佳答案

逐行:

  • 我们定义了局部变量 cont
  • 我们用当前延续调用一些 lambda 函数,也就是说,我们将当前延续作为参数传递给 lambda 函数。当前延续是一个有 1 个参数的函数,然后这个参数被用作 call/cc 的“返回值”(这里最终被忽略)。
  • 所以 k 在这里表示一切,这将在我们的例子中与 (lambda (call/cc-retval) (let () call/cc-retval (cont #f))) 意义接近。我们将 cont 值设置为这个延续。 call/cc 返回。
  • 由于 cont 现在是一个表示延续的函数,它的参数是“call/cc 的返回值”,我们只调用该函数,参数被忽略,我们需要再次调用 (cont #f)

  • 因此,我们最终得到的是无限循环。

    关于functional-programming - 有人可以解释一下方案中的这种延续吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1823731/

    10-12 21:16