10.3continuation

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。

你可能感兴趣的:(10.3continuation)