这是我的代码。当我调用 continuation 两次时,我希望"world"
显示两次。但它只输出一次。我错过了什么?
(define call-with-current-continuation call/cc)
(define (repeat arg)
(lambda (cc)
(cc arg)
(cc arg)))
(display (call/cc (repeat "world")))
这是我的代码。当我调用 continuation 两次时,我希望"world"
显示两次。但它只输出一次。我错过了什么?
(define call-with-current-continuation call/cc)
(define (repeat arg)
(lambda (cc)
(cc arg)
(cc arg)))
(display (call/cc (repeat "world")))
简短的版本:你正在捕捉的延续比你想象的要大。当方案在评估“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")))
如您所愿,两次打印“世界”。