Download presentation
Presentation is loading. Please wait.
Published byPrudence Julie Tucker Modified over 9 years ago
1
OCaml The PL for the discerning hacker.
2
Hello. I’m Zach, one of Sorin’s students. ztatlock@cs.ucsd.edu
3
ML Anatomy 101 ML Program = One Giant, Complex Expression Controlling complexity is the essence of computer programming. B. Kerninghan A complex system that works is invariably found to have evolved from a simple system that worked. J. Gall ML Program = ? ? ?
4
Building ML Programs ML provides tools to control complexity Build complex exprs from simple exprs Build complex types from simple types NOW THU
5
Building Expressions 1.basic (recap) 2.let 3.if 4.fun 5.demo M.C. Escher’s Waterfall in LEGO
6
basic TypeExpressionValue int55 5 * 5 * 5125 string“hello” string“Je” ^ “ll” ^ “o”“Jello” tuple(5 * 5, “ab” ^ “cd”)(25, “abcd”) int list[1; 2] @ [3; 4][1; 2; 3; 4] int list1 :: 2 :: 3 :: 4 :: [][1; 2; 3; 4]
7
basic Don’t know how it works ? Try it in the toplevel !
8
Building Expressions 1.basic (recap) 2.let 3.if 4.fun 5.demo M.C. Escher’s Waterfall in LEGO
9
Variables are central to programming Associate a name with a computation let expressions are how ML does it let
10
Bind name NM to expression E1 within E2 : let NM = E1 in E2 Semantics (what it means): 1.evaluate E1 to value V 2.replace NM with V in E2
11
let examples let x = 5 in x let x = 5 in x * x let x = 5 * 5 in x * x let x = “hello” in print_string x let print = print_string in print “hello”
12
let chaining (outside) Let syntax : let NM = E1 in E2 E2 can be another let let x = 2 in let y = 3 in let x2 = x * x in let y2 = y * y in x2 + y2
13
let nesting (inside) Let syntax : let NM = E1 in E2 E1 can be another let let x2 = let x = 5 in x * x in x2 + x2
14
let name clashes (outside) Let syntax : let NM = E1 in E2 What if NM appears in E2 ? let x = 1 in let x = 2 in x Our naïve semantics were wrong!
15
let name clashes Let syntax : let NM = E1 in E2 Semantics (what it means): 1.evaluate E1 to value V 2.replace UNBOUND NM with V in E2 Essentially, use nearest binding.
16
let name clashes (inside) Let syntax : let NM = E1 in E2 What if NM appears in E1 ? let x = let x = 5 in x * x in x * x
17
name clash mania let x = let x = 5 in let x = x * x in let x = let x = x + x in let x = x * x in x in x + x in x * x
18
name clash mania let x = let x = 5 in let x = 5 * 5 in let x = let x = x + x in let x = x * x in x in x + x in x * x
19
name clash mania let x = let x = 5 * 5 in let x = let x = x + x in let x = x * x in x in x + x in x * x
20
name clash mania let x = let x = 25 in let x = let x = x + x in let x = x * x in x in x + x in x * x
21
name clash mania let x = let x = 25 in let x = let x = 25 + 25 in let x = x * x in x in x + x in x * x
22
name clash mania let x = let x = 25 + 25 in let x = x * x in x in x + x in x * x
23
name clash mania let x = let x = 50 in let x = x * x in x in x + x in x * x
24
name clash mania let x = let x = 50 in let x = 50 * 50 in x in x + x in x * x
25
name clash mania let x = let x = 50 * 50 in x in x + x in x * x
26
name clash mania let x = let x = 2500 in x in x + x in x * x
27
name clash mania let x = let x = 2500 in 2500 in x + x in x * x
28
name clash mania let x = 2500 in x + x in x * x
29
name clash mania let x = let x = 2500 in x + x in x * x
30
name clash mania let x = let x = 2500 in 2500 + 2500 in x * x
31
name clash mania let x = 2500 + 2500 in x * x
32
name clash mania let x = 5000 in x * x
33
name clash mania let x = 5000 in 5000 * 5000
34
name clash mania 5000 * 5000
35
name clash mania 25,000,000
36
name clash, but later let x = 5 in let y = x * x in let x = 10 in y What is the value of this expr? 25 : because x was 5 when y was defined Binding to value is fixed at definition.
37
let vs. assign What’s the difference? No Time Travel let cannot affect anything before itself Lexical Scoping know where in prog each name defined
38
let vs. assign No Time Travel + Lexical Scoping Why are these good? 1.Behavior fixed at definition 2.Localize debugging 3.Simplifies reasoning
39
Building Expressions 1.basic (recap) 2.let 3.if 4.fun 5.demo M.C. Escher’s Waterfall in LEGO
40
if Programs make decisions Ask our patient and careful friend (computer): “If X is true, please go do A. Otherwise, please go do B.” if expressions are how ML does it
41
if if TEST then E1 else E2 If TEST evals to true, eval expr E1. Otherwise, eval expr E2.
42
if : just an expression if TEST then E1 else E2 if is an expression evaluates to a value has a type use anywhere expr accepted
43
if examples TypeExpressionValue intif true then 5 else 105 intif false then 5 else 1010 string if 1 < 5 then “hello” else “goodbye” “hello” int list 1 :: (if 10 mod 5 = 0 then [2; 3] else [4; 5]) [1; 2; 3]
44
if style exercise : Java to OCaml int foo(int i, boolean b, c, d) { if (b) { i++; } if (c) { return i + 2; } if (d) { i = i + 3; } else { return i + 4; } return i; }
45
if style exercise : Java to OCaml let foo i b c d = let j = if b then i + 1 else i in if c then j + 2 else if d then j + 3 else j + 4
46
if So far, then and else exprs had same type What about: if... then 5 else “hello” Rejected! then and else exprs must have same type
47
if rules Typing: if has same type as then and else exprs Eval (semantics): e1 : bool e2: T e3: T if e1 then e2 else e3 : T e1 )) true e2 )) v2. if e1 then e2 else e3 )) v2 e1 )) false e3 )) v3. if e1 then e2 else e3 )) v3
48
Building Expressions 1.basic (recap) 2.let 3.if 4.fun 5.demo M.C. Escher’s Waterfall in LEGO
49
abstraction
50
fun Abstraction: ultimate complexity manager Provide simple interface to complex expr functions are how ML does it
51
fun fun NM -> E Accept value V as input. Replace unbound name NM in expr E with V.
52
fun examples (fun x -> x) 5 (fun x -> x * x) 5 (fun x -> 5) 10 (fun x -> “hello “ ^ x) “india” let h = “hello ” in (fun x -> h ^ x) “india”
53
functions are values bind a function to a name with let : let double = fun x -> x + x in double 5 let quad = fun x -> (double x) + (double x) in quad 5
54
functions are values store functions in a tuple: ( fun x -> x, fun x -> 5, fun x -> “hello” ) tuple : can have different types : ‘a -> ‘a : ‘a -> int : ‘a -> string
55
functions are values store functions in a list: [ fun x -> x * x ; fun x -> 5 ; fun x -> x / 2 ] list : must have same type : int -> int
56
more fun parameters Can functions have only one parameter? Nope. functions can return functions! fun x -> fun y -> x + y takes x and returns (takes y and returns (sum of x and y))
57
function on function action let add = fun x -> fun y -> x + y in add 5 10
58
function on function action let str_concat = fun x -> fun y -> x ^ y in str_concat “hello “ “india”
59
functions are values functions can take functions as input! let apply = fun f -> fun x -> f x in apply print_string “hello”
60
functions are values functions can take functions as input! (fun f -> fun x -> f x) print_string “hello”
61
functions are values functions can take functions as input! (fun x -> print_string x) “hello”
62
functions are values functions can take functions as input! print_string “hello”
63
function shorthand syntactic sugar let NM P1... PN = E means let NM = fun P1 ->... fun PN -> E
64
function shorthand let add5 x = x + 5 let add x y = x + y let str_concat x y = x ^ y let apply f x = f x let apply_twice f x = f (f x)
65
recursive fun How do we write recursive functions? We can’t yet! Problem: NM is not bound until after let. Need more than just sugar...
66
recursive fun Need let rec : let rec NM P = E NM is bound to this definition inside E.
67
recursive fun let rec is_even n =...
68
recursive fun let rec is_even n = if n = 0 then true else if n = 1 then false else is_even (n – 2)
69
recursive fun let rec fib n =...
70
recursive fun let rec fib n = if n = 0 then 1 else if n = 1 then 1 else (fib (n – 1)) + (fib (n – 2))
71
recursive fun let rec factorial n =...
72
recursive fun let rec factorial n = if n = 0 then 1 else n * (factorial (n – 1))
73
recursive fun let rec forever () = (* infinite loop *)
74
recursive fun let rec forever () = forever ()
75
fun and let Simple enough: let x = 5 in let f y = x + y in f 10 Evals to 15.
76
fun and let But what about: let x = 5 in let f y = x + y in let x = 10 f 10 Still evals to 15. Behavior fixed at binding !
77
Building Expressions 1.basic (recap) 2.let 3.if 4.fun 5.demo M.C. Escher’s Waterfall in LEGO
78
demo Conway’s Game of Life
79
Building Expressions 1.basic (recap) 2.let 3.if 4.fun 5.demo Next Time : Building Types M.C. Escher’s Waterfall in LEGO
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.