Scheme `call/cc`的函数参数是否可以等效地调用continuation或在不调用continuation的情况下返回?
方案编程语言说 Scheme允许通过过程Scheme `call/cc`的函数参数是否可以等效地调用continuation或在不调用continuation的情况下返回?,scheme,continuations,continuation-passing,callcc,Scheme,Continuations,Continuation Passing,Callcc,方案编程语言说 Scheme允许通过过程call/cc捕获任何表达式的延续呼叫/抄送 必须传递一个参数的过程pcall/cc构造当前 继续并将其传递给p。延续本身由过程k表示。每次应用k 对于值,它将该值返回到调用/cc应用程序的继续部分。此值变为,单位为 本质上,应用call/cc的价值。 如果p返回而未调用k,则过程返回的值将成为 呼叫/cc 就call/cc调用而言,以下两种定义p等效值的方法是: p返回而不调用k p使用其返回值调用k 我不知道如何定义call/cc。 除了通过调用p
call/cc
捕获任何表达式的延续<代码>呼叫/抄送
必须传递一个参数的过程p
call/cc
构造当前
继续并将其传递给p
。延续本身由过程k
表示。每次应用k
对于值,它将该值返回到调用/cc
应用程序的继续部分。此值变为,单位为
本质上,应用call/cc
的价值。
如果p
返回而未调用k
,则过程返回的值将成为
呼叫/cc
就call/cc
调用而言,以下两种定义p
等效值的方法是:
返回而不调用p
k
使用其返回值调用p
k
call/cc
。
除了通过调用p
间接调用k
之外,call/cc
是否曾直接调用continuationk
call/cc
和p
都不调用continuationk
,这是否很好 是,(call/cc(lambda(k)1))(call/cc(lambda(k)(k 1))
。您可以通过使用连续传递样式变换来证明这一点
关键部分是call/cc
的CPS形式是(lambda(k)(lambda(f)(fk)k))
。这两个函数的CPS形式是(lambda(c)(lambda(k)(c1))
和(lambda(c)(lambda(k)(k1))
。替换和简化都会导致(lambda(k)(k1))
我非常喜欢分隔的连续体,因为它们有:
(reset (1 + (shift (lambda (f) f)))) <=> (lambda (v) (+ 1 v))
(复位(1+(移位(λ(f)f)))(λ(v)(+1v))
这也可以用代数来证明。要解决后续问题的细节,我们可以使用来自的代码scheme-cps-convert.rkt 减少第一个表达式:
((λ (f cc) (f (λ (x _) (cc x)) cc)) (λ (k $k2873) ($k2873 1)) halt)
= ((λ (k $k2873) ($k2873 1)) (λ (x _) (halt x)) halt)
= (halt 1)
第二个呢
((λ (f cc) (f (λ (x _) (cc x)) cc)) (λ (k $k2940) (k 1 $k2940)) halt)
= ((λ (k $k2940) (k 1 $k2940)) (λ (x _) (halt x)) halt)
= ((λ (x _) (halt x)) 1 halt)
= (halt 1)
证明它们是相等的,所以在该位置使用k或不使用k没有区别。谢谢。如何使用连续传递样式转换来证明
(call/cc(lambda(k)1))(call/cc(lambda(k)(k 1)))
?
((λ (f cc) (f (λ (x _) (cc x)) cc)) (λ (k $k2940) (k 1 $k2940)) halt)
= ((λ (k $k2940) (k 1 $k2940)) (λ (x _) (halt x)) halt)
= ((λ (x _) (halt x)) 1 halt)
= (halt 1)