160 likes | 275 Views
A global environment. val a = 15 val b = "foo"; val c = fn (n, p) => p = n * p; val d = [1,2];. Let and local environments. let val a = 20 in hd(d) + a end;. Function expressions generate closures. fun f(x, y) = let fun nested(z) = a + x + z in nested(y) end;.
E N D
A global environment val a = 15 val b = "foo"; val c = fn (n, p) => p = n * p; val d = [1,2];
Let and local environments let val a = 20 in hd(d) + a end;
Function expressions generate closures fun f(x, y) = let fun nested(z) = a + x + z in nested(y) end;
Function application 1 f(2, 10)
Nested aplication let fun nested(z) = a + x + z in nested(y) end
Closures as parameters val a = 15; fun addA(k) = k + a; fun doAction(f, a) = f(a);
Closures as return values fun makeAddX(x) = fn y => x + y; val add5 = makeAddX 5; val elevn = add5 6;
lambda = let let val x = 3; val y = 4; in x + y end;
Scheme • Expressions: atoms or (parenthesized lists) • Evaluator: • Parse an expression • If expression is (bound to) atom, return it • Otherwise, expression is a list with head V: • If V is a special form, do the special form • Otherwise, evaluate elements in tail and apply V to tail.
Scheme examples (define a 15) ; val a = 15 (define d '(1 2)) ; val d = [1, 2] (let* ((a 20)) (+ (car d) a)) let val a = 20 in hd(d) + a; (define (f x y) (let* ((nested (lambda (z) (+ a x z)))) (nested y))) fun f(x, y) = let val nested = fn z => a + x + z; in nested y;
Scheme dynamic typing • Types are "latent" • Types of values are irrelevant (unchecked) until you use them. • Typing is still strong: attempting to perform an invalid operation will raise a runtime type error
Objects are higher-order functions (define (make-student name id-num) (lambda (message) (cond ((equal? message 'getName) name) ((equal? message 'getID) id-num) ((equal? message 'cloneMe) (make-student (name id-num))) (else "INVALID MESSAGE")))) (define alice (make-student "Alice" 123456)) (display (alice 'getName))
Programs as data ; Evaluate list structure as if it were ; a program (eval (list '+ 1 2 3)) ; Single quote recursively prevents ; evaluation of sublists (define mystuff '(* (+ 1 2 3)))
Why functional programming? • Reason 1: influence on other languages • Understand languages of present • Modern languages borrow heavily from ideas invented in functional languages • Be prepared for languages of the future • Not everyone retires by 35 • New languages come along all the time • Learn concepts once, reuse anywhere
Why functional programming? • Reason 2: Functional style enhances clarity (when used appropriately) • Avoid side effects • Prefer return values to output parameters & side effects. Try to preserve "substitutability". Take advantage of constant data. • Use higher-order thinking • parameterize fns with fns for flexibility and reuse • Polymorphic types • Think of operations that are operate over "generic" types.
Why functional programming? • Reason 3: It's cool. • Programming is a medium for expressing ideas • Functional languages are powerful, flexible, and expressive. • You are not just a code monkey.