4

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

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

1 回答 1

4

逐行:

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

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

于 2009-12-01T04:32:45.103 回答