Scheme 如何分析call/cc中的等效接收方?

Scheme 如何分析call/cc中的等效接收方?,scheme,racket,continuations,callcc,Scheme,Racket,Continuations,Callcc,我正在读《Scheme and the Art of Programming》,但想不出以下问题的答案: 如果r是 在(…(调用/cc r)…)中,何时可以将r重写为 (lambda (continuation) body) 答案是:永远 escaper不是方案的一部分。它由该书、方案和编程艺术定义,因此: “escaper将其参数过程转换为类似定义的“escape”过程(也称为“continuation”),调用时,其结果将成为整个计算的结果。任何等待[该escape过程调用]结果的内容都将

我正在读《Scheme and the Art of Programming》,但想不出以下问题的答案:

如果r是

(…(调用/cc r)…)
中,何时可以将r重写为

(lambda (continuation) body)
答案是:永远


escaper
不是方案的一部分。它由该书、方案和编程艺术定义,因此:

escaper
将其参数过程转换为类似定义的“escape”过程(也称为“continuation”),调用时,其结果将成为整个计算的结果。任何等待[该escape过程调用]结果的内容都将被忽略。”(略为复制编辑)

(lambda(c..n)(c..n body))
的“
转义器
-ed”版本中的
(continuation body)
的结果将直接返回到顶层,除非
continuation
没有返回。它跳转到其目标上下文
(1)
,即等待
(call/cc r)
调用结果的上下文,因为该
继续
是通过调用
调用/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)
;如果
body
调用带有值的
continuation
,则该值通过
continuation--1
传递到
(1)

转义符
不是方案的一部分。它是由那本书、Scheme和编程艺术定义的,所以提到它很重要。“
escaper
将其参数过程转换为类似定义的“escape”过程(也称为“continuation”),调用该过程时,其结果将成为整个计算的结果。任何等待[该escape过程调用]结果的内容都将被忽略。”(略为复制编辑)
(call/cc r)
可以出现在该表达式的任何位置。这就是
表示。如果
r
(转义符(lambda(continuation)(continuation body))
,则
(r continuation)
的结果仍然是
(continuation body)
,因为
continuation
也是一个转义过程,并且首先被调用。r是
(转义符(lambda(continuation)(continuation body))
(lambda(continuation)(continuation body))
没有区别。(对不起,我的英语不好)你重复我回答的结论我在做这件事时更小心了一点。我做翻译,并认真地完成。但如果你这么清楚,为什么要问呢但你的要求很好,这给了我一个完成这个练习的机会干杯很高兴能帮上忙。:)(请注意使用
let
进行重新编写。这样做通常有助于我理解代码,如)
           ;; (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)))
                         ...)
           ;; (0)
             (... 
                  ;; (1)
                    (call/cc (lambda (continuation) body))
                         ...)
===
           ;; (0)
             (... 
                  ;; (1)
                    (let ((continuation continuation--1)) 
                       body)
                         ...)