【问题标题】:Scheme continuation unexpeded behavior方案延续异常行为
【发布时间】:2013-04-22 18:25:22
【问题描述】:

这是我的代码。当我调用 continuation 两次时,我希望 "world" 会显示两次。 但它只输出一次。我错过了什么?

(define call-with-current-continuation call/cc)
(define (repeat arg)
  (lambda (cc)
    (cc arg)
    (cc arg)))

(display (call/cc (repeat "world")))

【问题讨论】:

  • 这是意料之中的。 (cc arg) 调用转义继续。

标签: functional-programming scheme continuation


【解决方案1】:

简短版本:您正在捕捉的延续比您想象的要大。当方案在评估“call/cc”时,继续是“显示此结果然后退出程序”。因此,第一次调用 (lambda (cc) (cc arg) (cc arg)) 主体内的延续将打印值 ... 然后退出程序。

要获得您想要的行为,您可能需要一个分隔的延续,它仅将延续的部分捕获到顶层。不同的 Scheme 实现在分隔延续的可用性方面有所不同(尽管您可以在完全延续方面实现分隔延续,但会牺牲效率)。

例如,Racket 有一个“带有可组合延续的调用”,它只切断延伸到最近提示符的延续部分......并且每个顶级表达式周围都有一个隐含的提示。所以这个程序:

#lang racket

(define (repeat arg)
  (lambda (cc)
    (cc arg)
    (cc arg)))

(display (call-with-composable-continuation (repeat "world")))

如您所愿,两次打印“世界”。

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 2012-11-03
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多