The Evolution of Programming Languages Day 2 Lecturer: Xiao Jia The Evolution of PLs1
The Functional Paradigm The Evolution of PLs2
High Order Functions zeroth order: only variables and constants first order: function invocations, but results and parameters are zeroth order n-th order: results and parameters are (n- 1)-th order high order: n >= 2 The Evolution of PLs3
LISP f(x, y) (f x y) a + b (+ a b) a – b – c (- a b c) (cons head tail) (car (cons head tail)) head (cdr (cons head tail)) tail The Evolution of PLs4
It’s straightforward to build languages and systems “on top of” LISP (LISP is often used in this way) The Evolution of PLs5
Lambda f = λx.x 2 (lambda (x) (* x x)) ((lambda (x) (* x x)) 4) 16 The Evolution of PLs6
Dynamic Scoping int x = 4; f() { printf(“%d”, x); } main() { int x = 7; f(); } The Evolution of PLs7 Static Scoping Dynamic Scoping Describe a situation in which dynamic scoping is useful
Interpretation Defining car (cond ((eq (car expr) ’car) (car (cadr expr)) ) … The Evolution of PLs8
Scheme corrects some errors of LISP both simpler and more consistent (define factorial (lambda (n) (if (= n 0) 1 (* n (factorial (- n 1)))))) The Evolution of PLs9
Factorial with actors (define actorial (alpha (n c) (if (= n 0) (c 1) (actorial (- n 1) (alpha (f) (c (* f n))))))) The Evolution of PLs10
Static Scoping (define n 4) (define f (lambda () n)) (define n 7) (f) The Evolution of PLs11 LISP: 7 Scheme: 4
Example: Differentiating The Evolution of PLs12
Example: Differentiating The Evolution of PLs13 (define derive (lambda (f dx) (lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))) (define square (lambda (x) (* x x))) (define Dsq (derive sq 0.001)) -> (Dsq 3) 6.001
SASL St. Andrew’s Symbolic Language The Evolution of PLs14
Lazy Evaluation nums(n) = n::nums(n+1) second (x::y::xs) = y second(nums(0)) = second(0::nums(1)) = second(0::1::nums(2)) = 1 The Evolution of PLs15 infinite list
Lazy Evaluation if x = 0 then 1 else 1/x In C: X && Y if X then Y else false X || Y if X then true else Y if (p != NULL && p->f > 0) … The Evolution of PLs16
Standard ML (SML) MetaLanguage The Evolution of PLs17
Function Composition - infix o; - fun (f o g) x = g (f x); val o = fn : (’a -> ’b) * (’b -> ’c) -> ’a -> ’c - val quad = sq o sq; val quad = fn : real -> real - quad 3.0; val it = 81.0 : real The Evolution of PLs18
List Generator infix --; fun (m -- n) = if m < n then m :: (m+1 -- n) else []; [1,2,3,4,5] : int list The Evolution of PLs19
Sum & Products fun sum [] = 0 | sum (x::xs) = x + sum xs; fun prod [] = 1 | prod (x::xs) = x * prod xs; sum (1 -- 5); 15 : int prod (1 -- 5); 120 : int The Evolution of PLs20
Declaration by cases fun fac n = if n = 0 then 1 else n * fac(n- 1); fun fac 0 = 1 | fac n = n * fac(n-1); The Evolution of PLs21