我正在看这本书 方案和编程艺术但却想不出以下问题的答案。
如果 r 是
(escaper (lambda (continuation) (continuation body))
在 (... (call/cc r) ...)
,什么时候可以 r 改写为
(lambda (continuation) body)
答案是 总是.
escaper
不属于《计划》的一部分。它是由该书定义的。方案和编程艺术因此,
"
escaper
把它的参数过程变成类似定义的'转义'过程(也就是'继续'),当它被调用时,它的结果就成为整个计算的结果。任何等待[该转义过程的调用]结果的东西都会被忽略。" "(略经复制编辑)
的结果 (continuation body)
在" escaper
-的版本。(lambda (c..n) (c..n body))
会 被直接退回到顶层,除了。continuation
不 返回. 它 跳跃 变成 其 目的语境 (1)
即 即 的结果,而这一切都在等待 (call/cc r)
呼叫,因为 这个 continuation
是由该调用建立的 call/cc
:
;; (0) -- top level
(...
;; (1) <-----------------------------------\
(call/cc r) ;; r = (escaper (lambda (continuation)
;; (continuation body)))
...)
===
;; (0) -- top level
(...
;; (1)
(continuation--0 ;; set up by `escaper`
((lambda (continuation)
(continuation body))
continuation--1)) ;; set up by call/cc
...)
===
;; (0) -- top level
(...
;; (1)
(continuation--0
(let ((continuation continuation--1)) ;; by application of `lambda`
(continuation body)))
...)
所以,如果 body
返回,该结果被传递到 (1)
由 continuation--1
;如果 body
电话 continuation
的值,该值被传递到 (1)
由 continuation--1
. 没有任何东西返回 continuation--0
所以它的跳跃永远不会被触发。
而在
;; (0)
(...
;; (1)
(call/cc (lambda (continuation) body))
...)
===
;; (0)
(...
;; (1)
(let ((continuation continuation--1))
body)
...)
同样的事情发生:如果 body
返回,该结果被简单地返回到 (1)
;如果 body
电话 continuation
的值,该值被传递到 (1)
由 continuation--1
.