Scheme `call/cc`的函数参数是否可以等效地调用continuation或在不调用continuation的情况下返回?

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

方案编程语言说

Scheme允许通过过程
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
是否曾直接调用continuation
k

call/cc
p
都不调用continuation
k
,这是否很好

是,
(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)