[英]What does a continuation return in Scheme?
我遇到了一些我无法理解的东西。
#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
。
但我接下来尝试的是将变量定义为运行延续的结果:
(define x (cc 20))
我在REPL中看到200
是结果,但x
没有定义。
存储在cc
的continuation是否包含它的返回值,以便define
的调用永远不会返回,而评估是(* 10 val)
? 到底是怎么回事?
有两种类型的延续。
call/cc
产生的延续从不向其调用者返回值。 请参阅Will Ness的答案 。
但是,通过call-with-composable-continuation
continuation产生call-with-composable-continuation
是可组合的延续,它确实返回值。
如果要继续向其调用者返回值,则应使用可组合的延续,通过设置提示并使用call-with-composable-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!
之前把提示放在你希望继续的地方val!
保存它。
;; the prompt specifies that it's `(* 10 [])`, and not something larger
(call-with-continuation-prompt
(λ () (* 10 (val!)))
my-prompt)
然后,由于此延续具有由提示定义的明确“结束”,因此它可以在到达该结束时返回值。
(define x (cc 20))
; defines x as 200
另请参阅: “持续提示”究竟是什么?
它什么都不返回,因为它没有返回。 (cc 20)
正如(cc 100)
不将值返回给调用者。 cc
不是一个函数,它是一个延续 - 它记住它自己返回/ “提供”其值的位置。
(define x (cc 20))
大概是指伪代码,
(let ([val (cc 20)])
(primitive-define-top-level-var! "x" val))
但是(cc 20)
绕过val
的设置并使用它来定义x
,并直接返回到顶层,就像原始捕获的延续一样。
存储在
cc
的continuation是否包含其返回的[ “destination” - wn],以便define
的调用永远不会返回,而评估是(* 10 val)
?
是。
到底是怎么回事?
确切地说。
编辑:
在DrRacket中加载以下内容,
#lang scheme
(define cc #f)
(define (val!)
(call/cc
(lambda (k)
(set! cc k)
0)))
(* 10 (val!))
(cc 100)
(display "Good!\n")
(define x (cc 20))
(display "Shucks!\n")
我甚至收到一条错误消息,解释发生了什么:
语言:方案,调试; 内存限制:128 MB。
0
1000
好!
200
>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.