如何理解这种延续?

abe*_*008 4 scheme the-little-schemer

(let ([x (call/cc (lambda (k) k))])
    (x (lambda (ignore) "hi")))  => "hi"
Run Code Online (Sandbox Code Playgroud)

如何编写此延续的执行步骤?

Asu*_*awa 7

call/cc操作者用来调用给定的过程与当前延续(因此得名call-with-current-continuation).因此,要了解它是如何工作的,我们需要知道当前的延续是什么.

在你的程序中,在call/cc执行时,延续看起来像这样:

CONT = (let ([x HOLE])
         (x (lambda (ignore) "hi")))
Run Code Online (Sandbox Code Playgroud)

其中HOLE是插入值的占位符.换句话说,延续是剩余的计算.如果要进步,可以将值粘贴到延续中.

现在,call/cc捕获此延续并将其传递给过程(lambda (k) k).您可以看到此过程只是立即返回延续.所以程序简化为:

(let ([x CONT])
  (x (lambda (ignore) "hi")))
Run Code Online (Sandbox Code Playgroud)

应用通过call/cc使用您提供的值插入的延续替换当前计算所捕获的延续.因此应用程序(x (lambda (ignore) "hi"))变成:

(let ([x (lambda (ignore) "hi")])
  (x (lambda (ignore) "hi")))
Run Code Online (Sandbox Code Playgroud)

其余的应该遵循你已经知道的关于lambdas和应用的知识.