Download presentation
Presentation is loading. Please wait.
1
Continuation-passing Style (CPS)
2
Assignment-converted/alphatized IR (.alpha)
e ::= (let ([x e] ...) e) | (lambda (x ...) e) | (lambda x e) | (apply e e) | (e e ...) | (prim op e ...) | (apply-prim op e) | (if e e e) | (call/cc e) | x | (quote dat)
3
Administrative normal form (ANF) (.anf)
e ::= (let ([x e]) e) | (apply ae ae) | (ae ae ...) | (prim op ae ...) | (apply-prim op ae) | (if ae e e) | (call/cc ae) | ae ae ::= (lambda (x ...) e) | (lambda x e) | x | (quote dat)
4
Continuation-passing style (CPS) (.cps)
e ::= (let ([x (apply-prim op ae)]) e) | (let ([x (prim op ae ...)]) e) | (apply ae ae) | (ae ae ...) | (if ae e e) ae ::= (lambda (x ...) e) | (lambda x e) | x | (quote dat)
5
Programs in CPS require no stack and never return.
e ::= (let ([x (apply-prim op ae)]) e) | (let ([x (prim op ae ...)]) e) | (apply ae ae) | (ae ae ...) | (if ae e e) ae ::= (lambda (x ...) e) | (lambda x e) | x | (quote dat) Programs in CPS require no stack and never return. Instead, at each application, a continuation (a callback function) is passed forward explicitly. Points that would otherwise have extended the stack now create a closure (where the environment saves local variables and the stack tail). Return points become invocations of the current continuation.
6
(let ([x ((lambda (y z) z) a b)]) e)
ecps has a free var for e’s cont. ((lambda (k y z) (k 0 z)) (lambda (k v) ecps) a b) All functions take an extra continuation parameter. As call/cc lets us pass continuations as values, so must they (despite not using it).
7
call/cc = (lambda (k f) (f k k))
8
Visualizing CPS (example)
9
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
10
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 4]
11
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 3] fn {+} (fib (- n 2)) [n = 4]
12
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 2] fn {+} (fib (- n 2)) [n = 3] fn {+} (fib (- n 2)) [n = 4]
13
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
{1} fn {+} (fib (- n 2)) [n = 2] fn {+} (fib (- n 2)) [n = 3] fn {+} (fib (- n 2)) [n = 4]
14
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 3] fn {+} (fib (- n 2)) [n = 4]
15
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} {1} fn {+} (fib (- n 2)) [n = 3] fn {+} (fib (- n 2)) [n = 4]
16
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 3] fn {+} (fib (- n 2)) [n = 4]
17
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 4]
18
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 4]
19
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 4]
20
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
21
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 2] fn {+} {2}
22
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} (fib (- n 2)) [n = 2] fn {+} {2}
23
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
24
IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))
fn {+} {1} fn {+} {2} 3
25
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF (fib 4)
26
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF (fib 3) letk v0 e2 [n=4,n-1=3,…]
27
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF (fib 2) letk v0 e2 [n=3,n-1=2,…] letk v0 e2 [n=4,n-1=3,…]
28
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF (fib 1) -> 1 letk v0 e2 [n=2,n-1=1,…] letk v0 e2 [n=3,n-1=2,…] letk v0 e2 [n=4,n-1=3,…]
29
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF (fib 0) -> 0 letk v1 e4 [v0=1,n=2,n-1=1,…] letk v0 e2 [n=3,n-1=2,…] letk v0 e2 [n=4,n-1=3,…]
30
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF s [s=1,v0=1,v1=0,…] letk v0 e2 [n=3,n-1=2,…] letk v0 e2 [n=4,n-1=3,…]
31
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF (fib 1) -> 1 letk v1 e4 [v0=1,n=3,n-1=2,…] letk v0 e2 [n=4,n-1=3,…]
32
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF s [s=2,v0=1,v1=1,…] letk v0 e2 [n=4,n-1=3,…]
33
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF (fib 2) letk v1 e4 [v0=2,n=4,n-1=3,…]
34
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF (fib 1) -> 1 letk v0 e2 [n=2,n-1=3,…] letk v1 e4 [v0=2,n=4,n-1=3,…]
35
ANF (define (fib n) (let ([c (<= n 1)]) (if c n
0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s))))))) ANF (fib 0) -> 0 letk v1 e4 [v0=1,n=2,n-1=3,…] letk v1 e4 [v0=2,n=4,n-1=3,…]
36
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (fib 4 print)
37
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (lambda (v0) …) n=4 k = (fib 3 k) print
38
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS print (lambda (v0) …) n=4 k = (lambda (v0) …) n=3 k = (fib 2 k)
39
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (lambda (v0) …) n=3 k = print (lambda (v0) …) n=2 k = (fib 1 k) (lambda (v0) …) n=4 k =
40
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (lambda (v0) …) n=3 k = print (lambda (v0) …) n=2 k = (k 1) (lambda (v0) …) n=4 k =
41
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (lambda (v0) …) n=3 k = print (lambda (v1) …) n=2 v0=1 k (fib 0 k) (lambda (v0) …) n=4 k =
42
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (lambda (v0) …) n=3 k = print (k 0) (lambda (v1) …) n=2 v0=1 k (lambda (v0) …) n=4 k =
43
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (lambda (v0) …) n=3 k = print (k 1) (lambda (v0) …) n=4 k =
44
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (lambda (v1) …) n=3 v0=1 k print (fib 1 k) (lambda (v0) …) n=4 k =
45
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (lambda (v1) …) n=3 v0=1 k print (k 1) (lambda (v0) …) n=4 k =
46
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS print (k 2) (lambda (v0) …) n=4 k =
47
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS print (fib 2 k) (lambda (v1) …) n=4 v0=2 k
48
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (fib 1 k) print (lambda (v0) …) n=2 k = (lambda (v1) …) n=4 v0=2 k
49
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (k 1) print (lambda (v0) …) n=2 k = (lambda (v1) …) n=4 v0=2 k
50
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (fib 0 k) print (lambda (v1) …) n=2 v0=1 k (lambda (v1) …) n=4 v0=2 k
51
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (k 0) print (lambda (v1) …) n=2 v0=1 k (lambda (v1) …) n=4 v0=2 k
52
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS print (k 1) (lambda (v1) …) n=4 v0=2 k
53
CPS (define (fib n k) (let ([c (<= n 1)]) (if c (k n)
(let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s))))))))))) CPS (k 3) print
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.