很抱歉,这个简单的延续示例的计算结果为4,但我不知道为什么:
(call/cc
(lambda (k)
(* 5 (k 4)))) Chez方案9.5.3
发布于 2019-12-17 23:28:59
call/cc可以让你获得延续传递风格的优点,而不必用延续传递风格来编写它。例如:
(define (cars lsts)
(define (cars lsts k)
(cond ((null? lsts) (k '()))
((null? (car lsts)) '())
(else (cars (cdr lsts)
(lambda (r)
(k (cons (caar lsts) r)))))))
(cars lsts values))
;; eg
(cars '()) ; ==> ()
(cars '((1) (2) (3))) ; ==> (1 2 3)
(cars '((1) (2) ())) ; ==> ()可以这样写:
(define (cars lsts)
(call/cc
(lambda (bail)
(define (cars lsts)
(cond ((null? lsts) '())
((null? (car lsts)) (bail '()))
(else (cons (caar lsts) (cars (cdr lsts))))))
(cars lsts))))在CPS中,call/cc&如下所示:
(define (call/cc& proc k)
(define (exit& v ignored-k)
(k v))
(proc exit& k))您的简单示例可以很容易地重写为延续传递样式:
(call/cc& (lambda (k& real-k)
(k& 4 (lambda (res)
(*& 5 res real-k))))
display)可以看到,ignore-k被忽略了,4被传递给了call/cc&的continuation,我把它放入了display,然后在repl中显示了4。
发布于 2019-12-18 19:03:03
我将通过使用CPS编写具有相同语义的代码来向您解释。
((lambda (k)
(k 4
(lambda (v)
(* 5 v))))
(lambda (result stack)
;; this continuation will drop the stack
result))在调用延续K之后,您也可以使用剩余的堆栈来调用它,但堆栈被删除。
如果您考虑了剩余的堆栈,您将拥有:
((lambda (k)
(k 4
(lambda (v)
(* 5 v))))
(lambda (result stack)
;; this continuation will consider the stacked computation
(stack result)))在这种情况下,结果应该是20。
但在代码的语义中,通过调用calling,您丢弃了堆栈,即未完成的计算。
发布于 2019-12-17 22:05:35
continuation将返回传递给它的值(k 4),因此4是返回值。
https://stackoverflow.com/questions/59375971
复制相似问题