如何分析callcc中的等效接收器?

问题描述 投票:1回答:1

我正在看这本书 方案和编程艺术但却想不出以下问题的答案。

如果 r

(escaper (lambda (continuation) (continuation body))

(... (call/cc r) ...),什么时候可以 r 改写为

(lambda (continuation) body)
scheme racket continuations callcc
1个回答
2
投票

答案是 总是.

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.

© www.soinside.com 2019 - 2024. All rights reserved.