Scheme 从call/cc返回continuations
Matt可能在他的帖子中定义了helper函数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
(定义(当前续)
(电话/抄送(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值来逃避”.不过,你是对的,我相信你提供的两个定义在所有情况下都是等效的。不过,要证明这一点需要一些思考。投票支持这些漂亮的细节