我遇到了一些我不能理解的事情。
#lang scheme
(define cc #f)
(define (val!)
(call/cc
(lambda (k)
(set! cc k)
0)))
(* 10 (val!))
(cc 100)到目前为止一切顺利;(* 10 [])的延续存储在cc中,如果我们调用(cc 100),就会像预期的那样在REPL中看到1000。
但是下一步我尝试定义一个变量作为运行continuation的结果:
(define x (cc 20))我在REPL中看到了200的结果,但是x没有被定义。
存储在cc中的延续是否包含它的返回,因此对define的调用永远不会返回,取而代之的是(* 10 val)的结果?怎么一回事?
发布于 2017-09-30 12:45:22
到底怎么回事?
有两种类型的延续。
由call/cc生成的延续从不向其调用者返回值。有关这方面的更多信息,请参阅Will Ness's answer。
但是由call-with-composable-continuation产生的延续是可组合的延续,它确实返回值。
解决方案
如果您希望continuation向其调用者返回值,则应该通过设置提示并使用call-with-composable-continuation来使用可组合的continuation。
您可以定义一种提示:
(define my-prompt
(make-continuation-prompt-tag 'my-prompt))并使用call-with-composable-continuation中的提示符指定您只想捕获从提示符开始的延续。
(define cc #f)
(define (val!)
(call-with-composable-continuation
(lambda (k)
(set! cc k)
0)
my-prompt))然后,在调用val!保存延续之前,您只需将提示放在您希望继续开始的位置。
;; the prompt specifies that it's `(* 10 [])`, and not something larger
(call-with-continuation-prompt
(λ () (* 10 (val!)))
my-prompt)然后,因为这个延续有一个明确的" end“由提示符定义,所以当它到达该结束时,它可以返回一个值。
(define x (cc 20))
; defines x as 200https://stackoverflow.com/questions/46498782
复制相似问题