UP | HOME

delimited/undelimited continuation

Continuation is the future of the program, for example

(+ 3 2
  (* 5
     (+ 6 1)
     8))

What is the continuation of (+ 6 1)? We can get the result by replacing (+ 6 1) with a hole:

(+ 3 2
  (* 5
     ?hole
     8))

By encoding continuation with the lambda, continuation of (+ 6 1) is:

(lambda (x)
  (+ 3 2
    (* 5
       x
       8)))

We can check it by let/cc

(+ 3 2
   (* 5
      (let/cc k
        (k (+ 6 1)))
      8))

k is the continuation, original result is 285, you may guess new result will be 11405 since (+ 3 2 (* 5 285 8)) is 11405. But, actually the new result is still 285, because I do not tell all the true. Continuation is not

(lambda (x)
  (+ 3 2
    (* 5
       x
       8)))

but

(lambda (x)
  (exit
   (+ 3 2
    (* 5
       x
       8))))

This is because end the program also was the future of program. Thus, we have (+ 3 2 (* 5 (exit 285) 8)) that is 285, not (+ 3 2 (* 5 285 8)) = 11405. We call such continuation: undelimited continuation.

1. Delimited continuation

So what is delimited continuation? By default, abort locates at the most out scope, delimited continuation means we can assign others location. To do so, we need some helper(the following code cannot work in racket, but just pseudo code):

(+ 3 2
  (abort-here
    (* 5 x 8)))

Then the continuation would be:

(lambda (x)
  (exit
    (* 5 x 8)))

2. Conclusion

That's it, continuation can be parted to delimited and undelimited, now you know that :).

Date: 2021-03-13 Sat 00:00
Author: Lîm Tsú-thuàn