10.3 Continuations
A continuation is a value that encapsulates a piece of an expression context. The call-with-composable-continuation function captures the current continuation starting outside function call an running up to the nearest enclosing prompt. (Keep in mind that each REPL interaction is implicitly wrapped in a prompt.)
For example, in
at the point where 0 is evaluated, the expression context includes three nested addition expressions. We can grab that context by changing 0 to grab the continuation before returning 0:
> (define saved-k #f) | |||||
| |||||
3 |
The continuation saved in save-k encapsulates the program context (+ 1 (+ 1 (+ 1 ?))), where ? represents a place to plug in a result value – because that was the expression context when save-it! was called. The continuation is encapsulated so that it behaves like the function (lambda (v) (+ 1 (+ 1 (+ 1 v)))):
> (saved-k 0) |
3 |
> (saved-k 10) |
13 |
> (saved-k (saved-k 0)) |
6 |
The continuation captured by call-with-composable-continuation is determined dynamically, not syntactically. For example, with
| ||||
> (sum 5) | ||||
15 |
the continuation in saved-k becomes (lambda (x) (+ 5 (+ 4 (+ 3 (+ 2 (+ 1 x)))))):
> (saved-k 0) |
15 |
> (saved-k 10) |
25 |
A more traditional continuation operator in Scheme is call-with-current-continuation, which is often abbreviated call/cc. It is like call-with-composable-continuation, but applying the captured continuation first aborts (to the current prompt) before restoring the saved continuation. In addition, Scheme systems traditionally support a single prompt at the program start, instead of allowing new prompts via call-with-continuation-prompt. Continuations as in PLT Scheme are sometimes called delimited continuations, since a program can introduce new delimiting prompts, and continuations as captured by call-with-composable-continuation are sometimes called composable continuations, because they do not have a built-in abort.
For an example of how continuations are useful, see More: Systems Programming with PLT Scheme. For specific control operators that have more convenient names than the primitives described here, see scheme/control.