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

(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) 再次。

这样,我们最终得到的是无限循环。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top