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)
如何编写此延续的执行步骤?
的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和应用的知识.