嗯,好的。如果你能原谅我需要指望我的手指,定义
(define (current-continuation k1)
(call/cc& (lambda (cc k2) (k2 cc)) k1))
(define (call/cc& f k)
(f (lambda (v ignored-cont) (k v)) k))
拨通电话
(current-continuation after-cc-k)
进入
(call/cc& (lambda (cc k2) (k2 cc)) k1)
形参绑定下
k1 = after-cc-k
重写为
(call/cc& (lambda (cc k2) (k2 cc)) after-cc-k)
定义为
(f (lambda (v ignored-cont) (k v)) k)
形参绑定下
f = (lambda (cc k2) (k2 cc))
k = after-cc-k
重写为
((lambda (cc k2) (k2 cc)) (lambda (v ignored-cont) (after-cc-k v)) after-cc-k)
计算结果为
(k2 cc)
形参绑定下
cc = (lambda (v ignored-cont) (k1 v))
k2 = after-cc-k
重写为
(after-cc-k (lambda (v ignored-cont) (after-cc-k v)))
也就是说,在调用current-continuation之后返回到剩余的计算,在调用current-continuation之后继续剩余的计算。
现在定义
(define (current-continuation k1)
(call/cc& (lambda (cc k2) (cc cc k2)) k1))
导致调用的原因
(current-continuation after-cc-k)
定义为
(call/cc& (lambda (cc k2) (cc cc k2)) k1)
形参绑定下
k1 = after-cc-k
重写为
(call/cc& (lambda (cc k2) (cc cc k2)) after-cc-k)
定义为
(f (lambda (v ignored-cont) (k v)) k)
形参绑定下
f = (lambda (cc k2) (cc cc k2))
k = after-cc-k
重写为
((lambda (cc k2) (cc cc k2)) (lambda (v ignored-cont) (after-cc-k v)) after-cc-k)
计算结果为
(cc cc k2)
形参绑定下
cc = (lambda (v ignored-cont) (after-cc-k v))
k2 = after-cc-k
重写为
((lambda (v ignored-cont) (after-cc-k v))
(lambda (v ignored-cont) (after-cc-k v)) after-cc-k)
计算结果为
(after-cc-k v)
形参绑定下
v = (lambda (v ignored-cont) (after-cc-k v))
ignored-cont = ...
重写为
(after-cc-k (lambda (v ignored-cont) (after-cc-k v)))
即,与current-continuation 的其他定义相同。呼。