这是我的代码。当我将连续两次调用时,我希望"world"
显示两次。
但它只输出一次。我错过了什么?
(define call-with-current-continuation call/cc)
(define (repeat arg)
(lambda (cc)
(cc arg)
(cc arg)))
(display (call/cc (repeat "world")))
答案 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")))
按照您的意愿打印“世界”两次。