continuation是一个个表达式执行上下文封装的值。call-with-composable-continuation函数捕获当前的continuation运行到最近的闭合prompt。
(+ 1 (+1 (+ 1 0)))
在0被执行的点,表达式上下文是三个内嵌的表达式。我们能改变0来获得continuation在返回0之前。
>(define saved-k #f)
>(define (save-it!)
(call-with-composable-continuation
(lambda (k);k 就是捕获的continuation
(set! saved-k k)
0)))
continuation被save-k保存,它封装了程序(+ 1 (+ 1(+ 1 ?)))
。?代表了结果被插入值的地方,因为那是save-it!被调用的表达式上下文。continuation被封装像表达式(lambda (v) (+ 1 (+ 1 (+ 1 v))))
。
被call-with-composable-continuation捕获的continuation是动态的,而不是语法层面的。
>(define (sum n)
(if (zero? n)
(save-it!)
(+ n (sum (sub1 n)))))
>(sum 5)
15
saved-k变成了(lambda (x) (+ 5 (+ 4 (+ 3 (+ 2 (+ 1 x)))))
更加传统的continuation操作是call-with-current-continuation,经常缩写成call/cc。它和call-with-composable-continuation一样,但是她在恢复保存的continuation之前应用continuation到第一个aborts。