Continuation-passing Style (CPS)

Slides:



Advertisements
Similar presentations
Tree Recursion Traditional Approach. Tree Recursion Consider the Fibonacci Number Sequence: Time: , 1, 1, 2, 3, 5, 8, 13, 21,... /
Advertisements

Parameter passing mechanism: pass-by-reference. The Pass-by-reference mechanism - the agreement Recall: Parameter passing mechanism = agreement between.
Module Invocation & Parameters Tracing the Execution of Instructions with the Activation Stack.
Functions Prototypes, parameter passing, return values, activation frams.
1 Procedural Programming Paradigm Stacks and Procedures.
Def f(n): if (n == 0): return else: print(“*”) return f(n-1) f(3)
More about functions Plus a few random things. 2 Tail recursion A function is said to be tail recursive if the recursive call is the very last thing it.
Lambda Calculus and Lisp PZ03J. Lambda Calculus The lambda calculus is a model for functional programming like Turing machines are models for imperative.
Remote Procedure Call in SR Programming Language By Tze-Kin Tsang 3/20/2000.
How to load a program file? Lisp programs in Allegro are saved under the file extension.cl. To load a file into the Lisp console, use the following: (load.
28/06/2015CMPUT Functions (2)  Function calling convention  Various conventions available  One is specified by CMPUT229  Recursive functions.
Closure and Environment Compiler Baojian Hua
CS 152: Programming Language Paradigms February 24 Class Meeting Department of Computer Science San Jose State University Spring 2014 Instructor: Ron Mak.
ECA 225 Applied Interactive Programming1 ECA 225 Applied Online Programming DOM.
Designing with Procedures 1. Designing a Program with Procedures If the code for your program is going to be less than one page, normally don’t bother;
Functions and Closures. JavaScript Closures Are Everywhere In JS we often want to say “when this thing happens, do something” event driven programming.
UMBC CMSC Common Lisp II. UMBC CMSC Input and Output Print is the most primitive output function > (print (list 'foo 'bar)) (FOO BAR) The.
Julian on JavaScript: Functions Julian M Bucknall, CTO.
WHAT IS THE VALUE OF X? x = 0 for value in [3, 41, 12, 9, 74, 15] : if value < 10 : x = x + value print x.
Cs3180 (Prasad)L156HOF1 Higher-Order Functions. cs3180 (Prasad)L156HOF2 Equivalent Notations (define (f x y) (… body …)) = (define f (lambda (x y) (…
Martin Kruliš by Martin Kruliš (v1.0)1.
3/8/20161 Programming Languages and Compilers (CS 421) Reza Zamani Based in part on slides by Mattox Beckman, as updated.
Second Order Programming Intro2CS – week 10B 1. Functions are values too 2.
Programming Languages: Design, Specification, and Implementation G Rob Strom September 28, 2006.
Презентацию подготовила Хайруллина Ч.А. Муслюмовская гимназия Подготовка к части С ЕГЭ.
Functional Programming
Fundamentals of Java: AP Computer Science Essentials, 4th Edition
Reminder About Functions
Functions CSC 358/
Edited by Original material by Eric Grimson
CS 326 Programming Languages, Concepts and Implementation
Chapter 5 Functions DDC 2133 Programming II.
Closure conversion Compiling λ.
SSA in Scheme Static single assignment (SSA) :
Using local variable without initialization is an error.
CSC 253 Lecture 8.
First-class continuations
ساختمان داده ها و الگوریتم ها
CSC 253 Lecture 8.
6 Delegate and Lambda Expressions
The method invocation mechanism and the System Stack
Functions and Macros.
Programming Languages and Compilers (CS 421)
Continuations and Compilation
Dynamic Scoping Lazy Evaluation
Closure Closure binds a first-class function and a lexical environment together This is a complex topic, so we will build up our understanding of it we.
10:00.
Array and Method.
Recursion Chapter 18.
Continuation Marks A john clements talk.
6.001 SICP Further Variations on a Scheme
Explicit Application of Procedures, and Explicit Evaluation
Streams, Delayed Evaluation and a Normal Order Interpreter
Lisp: Using Functions as Data
Lecture 12: Message passing The Environment Model
6.001 SICP Explicit-control evaluator
Madhusudan Parthasarathy
6.001 SICP Explicit-control evaluator
Chapter 17 Recursion.
Lisp: Using Functions as Data
Programming Languages and Compilers (CS 421)
A global environment val a = 15 val b = "foo"; val c = fn (n, p)
Common Lisp II.
Unit-1 Introduction to Java
Recursive Procedures and Scopes
Code Blocks, Closures, and Continuations
Principles of Programming Languages
Runtime Stack Activation record for hanoi;
Parameters and Arguments
Presentation transcript:

Continuation-passing Style (CPS)

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)

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)

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)

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.

(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).

call/cc = (lambda (k f) (f k k))

Visualizing CPS (example)

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) fn {+} (fib (- n 2)) [n = 4]

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]

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]

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]

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]

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]

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]

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) fn {+} (fib (- n 2)) [n = 4]

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) fn {+} (fib (- n 2)) [n = 4]

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) fn {+} (fib (- n 2)) [n = 4]

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) fn {+} (fib (- n 2)) [n = 2] fn {+} {2}

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) fn {+} (fib (- n 2)) [n = 2] fn {+} {2}

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

IR (define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) fn {+} {1} fn {+} {2} 3

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)

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,…]

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,…]

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,…]

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,…]

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,…]

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,…]

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,…]

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,…]

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,…]

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,…]

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)

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

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)

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 =

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 =

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 =

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 =

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 =

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 =

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 =

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 =

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

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

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

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

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

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

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