Scheme 如何分析call/cc中的等效接收方?
我正在读《Scheme and the Art of Programming》,但想不出以下问题的答案: 如果r是 在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过程调用]结果的内容都将
(…(调用/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)
...)