; Continuation Passing Style Demo ;;;; From http://en.wikibooks.org/wiki/Haskell/Continuation_passing_style ;;;; ;;;; Example: A simple module, no continuations ;;;; ;;;; -- We assume some primitives add and square for the example: ;;;; ;;;; add :: Int -> Int -> Int ;;;; add x y = x + y ;;;; ;;;; square :: Int -> Int ;;;; square x = x * x ;;;; ;;;; pythagoras :: Int -> Int -> Int ;;;; pythagoras x y = add (square x) (square y) ;;;; ;;;; And the same function pythagoras, written in CPS looks like this: ;;;; ;;;; Example: A simple module, using continuations ;;;; ;;;; -- We assume CPS versions of the add and square primitives, ;;;; -- (note: the actual definitions of add'cps and square'cps are not ;;;; -- in CPS form, they just have the correct type) ;;;; ;;;; add'cps :: Int -> Int -> (Int -> r) -> r ;;;; add'cps x y k = k (add x y) ;;;; ;;;; square'cps :: Int -> (Int -> r) -> r ;;;; square'cps x k = k (square x) ;;;; ;;;; pythagoras'cps :: Int -> Int -> (Int -> r) -> r ;;;; pythagoras'cps x y k = ;;;; square'cps x $ \x'squared -> ;;;; square'cps y $ \y'squared -> ;;;; add'cps x'squared y'squared $ \sum'of'squares -> ;;;; k sum'of'squares (define (cps'add x y r) (r (+ x y))) (define (cps'square x r) (r (* x x))) (define (cps'pythag x y r) (cps'square x (lambda (xx) (cps'square y (lambda (yy) (cps'add xx yy (lambda (zz) (r zz)))))))) (say '(cps'pythag 3 4 --->)) (cps'pythag 3 4 (lambda (x) (assert-equal 'XXV. (say (roman x)))))