1

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

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

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

1 回答 1

4

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

要获得您想要的行为,您可能需要一个分隔的 continuation,它只捕获顶层的延续部分。不同的方案实现在定界延续的可用性方面有所不同(尽管您可以以完全延续的形式实现定界延续,但以牺牲效率为代价)。

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

#lang racket

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

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

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

于 2013-04-29T07:36:30.260 回答