Presentation is loading. Please wait.

Presentation is loading. Please wait.

OCaml The PL for the discerning hacker.. Hello. I’m Zach, one of Sorin’s students.

Similar presentations


Presentation on theme: "OCaml The PL for the discerning hacker.. Hello. I’m Zach, one of Sorin’s students."— Presentation transcript:

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

80


Download ppt "OCaml The PL for the discerning hacker.. Hello. I’m Zach, one of Sorin’s students."

Similar presentations


Ads by Google