首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scheme中,continuation返回什么?

在Scheme中,continuation返回什么?
EN

Stack Overflow用户
提问于 2017-09-30 09:38:48
回答 1查看 522关注 0票数 3

我遇到了一些我不能理解的事情。

代码语言:javascript
复制
#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的结果:

代码语言:javascript
复制
(define x (cc 20))

我在REPL中看到了200的结果,但是x没有被定义。

存储在cc中的延续是否包含它的返回,因此对define的调用永远不会返回,取而代之的是(* 10 val)的结果?怎么一回事?

EN

回答 1

Stack Overflow用户

发布于 2017-09-30 12:45:22

到底怎么回事?

有两种类型的延续。

call/cc生成的延续从不向其调用者返回值。有关这方面的更多信息,请参阅Will Ness's answer

但是由call-with-composable-continuation产生的延续是可组合的延续,它确实返回值。

解决方案

如果您希望continuation向其调用者返回值,则应该通过设置提示并使用call-with-composable-continuation来使用可组合的continuation。

您可以定义一种提示:

代码语言:javascript
复制
(define my-prompt
  (make-continuation-prompt-tag 'my-prompt))

并使用call-with-composable-continuation中的提示符指定您只想捕获从提示符开始的延续。

代码语言:javascript
复制
(define cc #f)

(define (val!)
  (call-with-composable-continuation
   (lambda (k)
     (set! cc k)
     0)
   my-prompt))

然后,在调用val!保存延续之前,您只需将提示放在您希望继续开始的位置。

代码语言:javascript
复制
;; the prompt specifies that it's `(* 10 [])`, and not something larger
(call-with-continuation-prompt
 (λ () (* 10 (val!)))
 my-prompt)

然后,因为这个延续有一个明确的" end“由提示符定义,所以当它到达该结束时,它可以返回一个值。

代码语言:javascript
复制
(define x (cc 20))
; defines x as 200

另请参阅:What exactly is a "continuation prompt?"

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46498782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档