我的计划调用/ cc的泥泞心理模型是
1)设置一个新的范围(我们称它为current-scope)
2)用当前的延续调用提供的参数函数。
当前延续实际上是到当前作用域末端的跳转。 IE,调用current-continuation会跳到current-scope的末尾(并返回调用current-continuation的所有参数)。
因此,当设置了呼叫/抄送继续时!转到另一个调用/ cc中的某个变量(稍后将其缓存),然后调用外部调用/ cc延续,我们跳转到外部延续的末尾。
现在,我们剩下的所有代码都是在内存中自由浮动的,因为垃圾回收器尚未实现。如果我们仍然可以访问内部调用/ cc延续的缓存延续,则scheme确定该代码可访问并且不删除我们剩下的范围。因此,如果我们调用缓存的延续,则可以安全地“及时返回”到我们留下的范围的末端。
基于以上内容,此代码可在我的方案REPL中使用:
> (define time-machine 'delorean)
> (define (hit-88-miles-per-hour)
(call/cc (lambda (cc)
(let ([shenanigans "Do things with doc"])
(call/cc (lambda (innercc)
(set! time-machine innercc)
(cc "Back to the future!")))
shenanigans))))
> (hit-88-miles-per-hour)
"Back to the future!"
> (time-machine)
"Do things with doc"
我的理解大致正确吗?如果不是,请更正,因为继续学习是一种认真的心理锻炼。