计划延续未开展的行为

时间:2013-04-29 06:44:58

标签: functional-programming scheme continuation

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

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

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

1 个答案:

答案 0 :(得分:4)

简短版本:你捕获的延续比你想象的要大。当scheme计算“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")))

按照您的意愿打印“世界”两次。