Continuation-Passing Style CPS: Moving Away From Scheme As The Host Language
Continuation-Passing Style CPS: Moving Away From Scheme As The Host Language
CPS
(define fact
(lambda (n)
(if (= n 0)
1
(* n (fact (- n 1))))))
Regular Factorial,
Hosted in C#
public class Fact {
Solutions:
(define fact
(lambda (n)
(if (= n 0)
1
(* n (fact (- n 1))))))
Regular Factorial,
Hosted in Scheme
(define fact
(lambda (n)
(if (= n 0)
1
(* n (fact (- n 1))))))
Continuations
(define fact
(lambda (n)
(if (= n 0)
1
(* n (fact (- n 1))))))
CPS Factorial,
Hosted in Scheme
(define fact-cps
(lambda (n k)
(if (= n 0)
(k 1)
(fact-cps (- n 1)
(lambda (v)
(k (* n v)))))))
CPS Factorial,
Hosted in Scheme
(define fact-cps
(lambda (n k)
(if (= n 0)
(k 1)
(fact-cps (- n 1)
(lambda (v)
(k (* n v)))))))
(define length
(lambda (lyst)
(cond
((null? lyst) 0)
(else (+ 1 (length (cdr lyst)))))))
(define length-cps
(lambda (lyst k)
(cond
((null? lyst) (k 0))
(else (length-cps (cdr lyst)
(lambda (v)
(k (+ 1 v))))))))
(define length-cps
(lambda (lyst k)
(cond
((null? lyst) (k 0))
(else (length-cps (cdr lyst)
(lambda (v)
(k (+ 1 v))))))))
(define length-cps-ds
(lambda (lyst k)
(cond
((null? lyst) (apply-cont k 0))
(else (length-cps-ds (cdr lyst)
(make-cont “addem” k))))))
(define proc
(lambda ()
(func1)
(func2)
(func3)
...
(proc)))
Getting rid of Recursion
(define proc
(lambda (a b c)
(func1 a)
(func2 b)
(func3 c)
...
(proc a b c)))
Getting rid of Recursion
(define reg-a 0)
(define reg-b 1)
(define reg-c 2)
(define proc
(lambda ()
(func1 reg-a)
(func2 reg-b)
(func3 reg-c)
...
(set! reg-a (+ reg-a 1)
(set! reg-b (- reg-a 1)
(set! reg-c (* reg-a 6)
(proc)))
Register Machine (RM)
(define reg-a 0) reg-a = 0
(define reg-b 1) reg-b = 1
(define reg-c 2) reg-c = 2