我正在阅读Scheme and the Art of Programming一书,但想不出以下问题的答案:
如果r是
(escaper (lambda (continuation) (continuation body))
in (... (call/cc r) ...)
, 什么时候r可以改写为
(lambda (continuation) body)
我正在阅读Scheme and the Art of Programming一书,但想不出以下问题的答案:
如果r是
(escaper (lambda (continuation) (continuation body))
in (... (call/cc r) ...)
, 什么时候r可以改写为
(lambda (continuation) body)
答案是:总是。
escaper
不是方案的一部分。它是由那本书,Scheme and the Art of Programming定义的,因此:
“
escaper
将其参数过程转换为类似定义的'转义'过程(又名'延续'),当被调用时,其结果将成为整个计算的结果。任何等待[该转义过程调用的]结果的东西都会被忽略。” (略有复制编辑)
(continuation body)
“ escaper
-ed”版本的(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)
by continuation--1
; 如果使用值body
调用 continuation
,则该值将传递给(1)
by continuation--1
。没有返回任何东西continuation--0
,所以它的跳转永远不会被触发。
而在
;; (0)
(...
;; (1)
(call/cc (lambda (continuation) body))
...)
===
;; (0)
(...
;; (1)
(let ((continuation continuation--1))
body)
...)
完全相同的事情发生:如果body
返回,该结果将简单地返回到(1)
; 如果使用值body
调用 continuation
,则该值将传递给(1)
by continuation--1
。