Scheme 从call/cc返回continuations

Scheme 从call/cc返回continuations,scheme,continuations,Scheme,Continuations,Matt可能在他的帖子中定义了helper函数 (定义(当前续) (电话/抄送(lambda(抄送)(抄送))) 获取并返回当前的延续。为什么使用(cc)返回延续?为什么不使用cc: (定义(当前续) (呼叫/抄送(lambda(抄送)抄送))) May的示例与当前continuation的任何一个版本都相同。这只是一个风格问题,还是工作中存在更深层次的问题?因此,请记住CPS中的call/cc: (define (call/cc& f k) (f (lambda (v igno

Matt可能在他的帖子中定义了helper函数

(定义(当前续)
(电话/抄送(lambda(抄送)(抄送)))
获取并返回当前的延续。为什么使用
(cc)
返回延续?为什么不使用
cc

(定义(当前续)
(呼叫/抄送(lambda(抄送)抄送)))

May的示例与
当前continuation
的任何一个版本都相同。这只是一个风格问题,还是工作中存在更深层次的问题?

因此,请记住CPS中的
call/cc

(define (call/cc& f k)
  (f (lambda (v ignored-cont) (k v)) k))
第一个是这样的:

(define (current-continuation k1)
  (call/cc& (lambda (cc k2) (cc cc k2)) k1))
(define (current-continuation k1)
  (call/cc& (lambda (cc k2) (k2 cc)) k1))
第二个是这样的:

(define (current-continuation k1)
  (call/cc& (lambda (cc k2) (cc cc k2)) k1))
(define (current-continuation k1)
  (call/cc& (lambda (cc k2) (k2 cc)) k1))

由于
call/cc
将通过
k1
作为
k2
cc
将使用
k1
这两种方法,它们最终都将执行
(k1-cc)
。因此,两者之间没有区别

啊,好的。如果你能原谅我需要依靠我的手指来完成这个定义

(定义(当前延续k1)
(呼叫/抄送和(lambda(抄送k2)(抄送k2))k1))
(定义(呼叫/抄送和抄送)
(f(lambda(v忽略cont)(k v))k)
接电话

(当前在-cc-k之后继续)
进入

(调用/cc&(lambda(cc k2)(k2 cc))k1)
在形式参数绑定下

k1=after-cc-k
改写成

(调用/cc&(lambda(cc k2)(k2 cc))在-cc-k之后)
定义为

(f(λ(v忽略继续)(k v))k)
在形式参数绑定下

f=(λ(cc k2)(k2 cc))
k=后-cc-k
改写成

((lambda(cc k2)(k2 cc))(lambda(v忽略cont)(after-cc-k v))after-cc-k)
评估结果是

(k2 cc)
在形式参数绑定下

cc=(λ(v忽略继续)(k1 v))
k2=后-cc-k
改写成

(在-cc-k之后(lambda(v忽略cont)(在-cc-k之后v)))
也就是说,在调用
current continuation
后返回到剩余的计算,在调用
current continuation
后返回剩余的计算

现在定义

(定义(当前延续k1)
(呼叫/抄送和(lambda(抄送k2)(抄送k2))k1))
是什么引起了这个电话

(当前在-cc-k之后继续)
定义为

(调用/cc&(lambda(cc k2)(cc k2))k1)
在形式参数绑定下

k1=after-cc-k
改写成

(调用/cc&(lambda(cc k2)(cc k2))在-cc-k之后)
定义为

(f(λ(v忽略继续)(k v))k)
在形式参数绑定下

f=(λ(cc k2)(cc k2))
k=后-cc-k
改写成

((lambda(cc k2)(cc cc k2))(lambda(v忽略cont)(after-cc-k v))after-cc-k)
评估结果是

(抄送k2)
在形式参数绑定下

cc=(lambda(v忽略cont)(在-cc-k v之后))
k2=后-cc-k
改写成

((lambda(v忽略cont)(在-cc-k v之后))
(lambda(v忽略cont)(在-cc-k之后v))在-cc-k之后)
评估结果是

(在-cc-k v之后)
在形式参数绑定下

v=(lambda(v忽略继续)(在-cc-k v之后))
忽略了cont=。。。
改写成

(在-cc-k之后(lambda(v忽略cont)(在-cc-k之后v)))

i、 例如,
当前延续的另一个定义也产生了相同的结果。唷。

在所写的示例中,没有区别。然而,如果需要的话,可以提供更健壮的方法,因为带有延续的转义可以更深入地嵌套。也就是说,你可以这样写

(定义(当前续)
(呼叫/抄送(lambda(抄送)(+1234(抄送)))
(定义(当前续)
(呼叫/抄送(lambda(抄送)(printf“~v”(抄送‘‘)’))

…或者类似的东西,你仍然会得到相同的结果。基本上,我认为作为一个经验丰富的continuations程序员,“是的,我想用continuation值来逃避”.不过,你是对的,我相信你提供的两个定义在所有情况下都是等效的。不过,要证明这一点需要一些思考。

投票支持这些漂亮的细节