Programming Languages and Compilers (CS 421)

Similar documents
Programming Languages and Compilers (CS 421)

Booleans (aka Truth Values) Programming Languages and Compilers (CS 421) Booleans and Short-Circuit Evaluation. Tuples as Values.

# true;; - : bool = true. # false;; - : bool = false 9/10/ // = {s (5, "hi", 3.2), c 4, a 1, b 5} 9/10/2017 4

COSE212: Programming Languages. Lecture 0 Course Overview

Programming Languages and Compilers (CS 421)

Programming Languages & Compilers. Programming Languages and Compilers (CS 421) I. Major Phases of a Compiler. Programming Languages & Compilers

Programming Languages & Compilers. Programming Languages and Compilers (CS 421) Programming Languages & Compilers. Major Phases of a Compiler

Introduction to ML. Mooly Sagiv. Cornell CS 3110 Data Structures and Functional Programming

Programming Languages and Compilers (CS 421)

n (0 1)*1 n a*b(a*) n ((01) (10))* n You tell me n Regular expressions (equivalently, regular 10/20/ /20/16 4

Introduction to ML. Mooly Sagiv. Cornell CS 3110 Data Structures and Functional Programming

Introduction to ML. Mooly Sagiv. Cornell CS 3110 Data Structures and Functional Programming

Programming Languages and Compilers (CS 421)

understanding recursive data types, recursive functions to compute over them, and structural induction to prove things about them

Programming Languages and Compilers (CS 421)

n What is its running time? 9/18/17 2 n poor_rev [1,2,3] = n (poor_rev [1] = n ((poor_rev [1] =

Programming Languages and Compilers (CS 421)

CSCI-GA Scripting Languages

To figure this out we need a more precise understanding of how ML works

n Takes abstract syntax trees as input n In simple cases could be just strings n One procedure for each syntactic category

INTRODUCTION PRINCIPLES OF PROGRAMMING LANGUAGES. Norbert Zeh Winter Dalhousie University 1/10

CSE 504: Compiler Design

San José State University College of Science/Department of Computer Science CS152, Programming Paradigms, Sections 3 & 4, Fall Semester, 2016

Two Problems. Programming Languages and Compilers (CS 421) Type Inference - Example. Type Inference - Outline. Type Inference - Example

Programming Languages and Compilers (CS 421)

CS 4120 and 5120 are really the same course. CS 4121 (5121) is required! Outline CS 4120 / 4121 CS 5120/ = 5 & 0 = 1. Course Information

The Substitution Model

Why OCaml? Introduction to Objective Caml. Features of OCaml. Applications written in OCaml. Stefan Wehr

Introduction to Objective Caml

Principles of Compiler Construction ( )

Closures. Mooly Sagiv. Michael Clarkson, Cornell CS 3110 Data Structures and Functional Programming

n n Try tutorial on front page to get started! n spring13/ n Stack Overflow!

CMSC 330: Organization of Programming Languages. Formal Semantics of a Prog. Lang. Specifying Syntax, Semantics

CIS24 Project #3. Student Name: Chun Chung Cheung Course Section: SA Date: 4/28/2003 Professor: Kopec. Subject: Functional Programming Language (ML)

Closures. Mooly Sagiv. Michael Clarkson, Cornell CS 3110 Data Structures and Functional Programming

Programming Languages and Compilers (CS 421)

Principles of Compiler Construction ( )

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

CVO103: Programming Languages. Lecture 5 Design and Implementation of PLs (1) Expressions

CS457/557 Functional Languages

Forward Recursion. Programming Languages and Compilers (CS 421) Mapping Recursion. Forward Recursion: Examples. Folding Recursion.

ECE573 Introduction to Compilers & Translators

F28PL1 Programming Languages. Lecture 11: Standard ML 1

San José State University College of Science/Department of Computer Science CS152, Programming Paradigms, Sections 1 & 2 Spring Semester, 2018

Intensive Introduction to Computer Science. Course Overview Programming in Scratch

Data Types. Prof. Clarkson Fall Today s music: Pokémon Theme by Jason Paige

Introduction to Programming System Design CSCI 455x (4 Units)

A Functional Evaluation Model

CMSC 330: Organization of Programming Languages. Operational Semantics

Dialects of ML. CMSC 330: Organization of Programming Languages. Dialects of ML (cont.) Features of ML. Functional Languages. Features of ML (cont.

Programming Languages and Techniques (CIS120)

Translator Design CRN Course Administration CMSC 4173 Spring 2017

Programming Languages and Techniques (CIS120)

Languages and Automata

Welcome to CS 135 (Winter 2018)

CSE4305: Compilers for Algorithmic Languages CSE5317: Design and Construction of Compilers

Introduction to OCaml

Lecture 15 CIS 341: COMPILERS

The Substitution Model. Nate Foster Spring 2018

Functions. Nate Foster Spring 2018

CS/SE 153 Concepts of Compiler Design

CMPE 152 Compiler Design

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

n Closed book n You are allowed 5 cheat pages n Practice problems available in Course Materials n Check grades in Rainbow grades

To figure this out we need a more precise understanding of how ML works

San José State University College of Science/Department of Computer Science CS152, Programming Paradigms, Sections 1 & 2, Fall Semester, 2017

Tail Calls. CMSC 330: Organization of Programming Languages. Tail Recursion. Tail Recursion (cont d) Names and Binding. Tail Recursion (cont d)

Functional Programming. Lecture 2: Algebra

Introduction to ML. Based on materials by Vitaly Shmatikov. General-purpose, non-c-like, non-oo language. Related languages: Haskell, Ocaml, F#,

Formal Semantics. Prof. Clarkson Fall Today s music: Down to Earth by Peter Gabriel from the WALL-E soundtrack

CMSC330 Spring 2016 Midterm #2 9:30am/12:30pm/3:30pm

CS 241 Data Organization. August 21, 2018

Tutorials. Tutorial every Friday at 11:30 AM in Toldo 204 * discuss the next lab assignment

Principles of Programming Languages [PLP-2015] Detailed Syllabus

COP4020 Programming Assignment 1 - Spring 2011

(Refer Slide Time: 4:00)

CS 11 Haskell track: lecture 1

Chapter 11 :: Functional Languages

Syllabus COSC-051-x - Computer Science I Fall Office Hours: Daily hours will be entered on Course calendar (or by appointment)


CMSC 330: Organization of Programming Languages. OCaml Imperative Programming

Writing Evaluators MIF08. Laure Gonnord

CSE413: Programming Languages and Implementation Racket structs Implementing languages with interpreters Implementing closures

CSC 326H1F, Fall Programming Languages. What languages do you know? Instructor: Ali Juma. A survey of counted loops: FORTRAN

Recap: Functions as first-class values

Philadelphia University Faculty of Information Technology Department of Computer Science --- Semester, 2007/2008. Course Syllabus

LECTURE 16. Functional Programming

cmpt 440/821 Advanced Topics in Programming Languages

CMSC 330: Organization of Programming Languages

CS Compiler Construction West Virginia fall semester 2014 August 18, 2014 syllabus 1.0

CS383 PROGRAMMING LANGUAGES. Kenny Q. Zhu Dept. of Computer Science Shanghai Jiao Tong University

Scope and Introduction to Functional Languages. Review and Finish Scoping. Announcements. Assignment 3 due Thu at 11:55pm. Website has SML resources

COMP 105 Homework: Type Systems

Types and Type Inference

CSCD18: Computer Graphics. Instructor: Leonid Sigal

CMSC330 Spring 2016 Midterm #1 9:30am/12:30pm/3:30pm

ITT8060 Advanced Programming

Welcome to CS 135 (Fall 2018) Themes of the course. Lectures. cs135/

General Course Information. Catalogue Description. Objectives

A First Look at ML. Chapter Five Modern Programming Languages, 2nd ed. 1

Transcription:

Programming Languages and Compilers (CS 421) Elsa L Gunter 2112 SC, UIUC https://courses.engr.illinois.edu/cs421/fa2017/cs421d Based in part on slides by Mattox Beckman, as updated by Vikram Adve and Gul Agha 9/12/17 1

Contact Information - Elsa L Gunter n Office: 2112 SC n Office hours: n Thursday 9:00am 9:50pm n Friday 1:00pm 1:50pm n Also by appointment n Email: egunter@illinois.edu 9/12/17 2

Overflow Section n If you are not registered and want to be, fill out the form at n http://go.cs.illinois.edu/cs421overflow 9/12/17 3

Course TAs Taiyu Dong Dan Plyukhin Jing Huang Fan Yang 9/12/17 4

Contact Information - TAs n Teaching Assistants Office: 0207 SC n Taiyu Dong n Email: tdong7@illinois.edu n Hours: Mon 9:00am 9:50am Thu 2:00pm 2:50pm n Jing Huang n Email: jhuang81@illinois.edu n Hours: Tue 6:00pm 7:40pm 9/12/17 5

Contact Information TAs cont n Dan Plyukhin n Email: daniilp2@illinois.edu n Hours: Mon, Wed 12:30pm 1:20pm n Fan Yan n Email: fanyang6@illinois.edu n Hours: Wed, Fri 9:00am 9:50am 9/12/17 6

Course Website n https://courses.engr.illinois.edu/cs421/fa2017/cs421d n Main page - summary of news items n Policy - rules governing course n Lectures - syllabus and slides n MPs - information about assignments n Exams n Unit Projects - for 4 credit students n Resources - tools and helpful info n FAQ 9/12/17 7

Some Course References n No required textbook n Some suggested references 9/12/17 8

Some Course References n No required textbook. n Pictures of the books on previous slide n Essentials of Programming Languages (2nd Edition) by Daniel P. Friedman, Mitchell Wand and Christopher T. Haynes, MIT Press 2001. n Compilers: Principles, Techniques, and Tools, (also known as "The Dragon Book"); by Aho, Sethi, and Ullman. Published by Addison-Wesley. ISBN: 0-201-10088-6. n Modern Compiler Implementation in ML by Andrew W. Appel, Cambridge University Press 1998 n Additional ones for Ocaml given separately 9/12/17 9

Course Grading n Assignments 20% n About 12 Web Assignments (WA) (~7%) n About 6 MPs (in Ocaml) (~7%) n About 5 Labs (~6%) n All WAs and MPs Submitted by PrairieLearn n Late submission penalty: 20% n Labs in Computer-Based Testing Center (Grainger) n Self-scheduled over a three day period n No extensions beyond the three day period n Fall back: Labs become MPs 9/12/17 10

Course Grading n 2 Midterms - 20% each n n n Labs in Computer-Based Testing Center (Grainger) Self-scheduled over a three day period No extensions beyond the three day period n Fall back: In class backup dates Oct 12, Nov 16 n DO NOT MISS EXAM DATES! n Final 40% - Dec 19, 8:00am 11:00am n Mayuse of CBTC for Final n Percentages are approximate 9/12/17 11

Course Assingments WA & MP n You may discuss assignments and their solutions with others n You may work in groups, but you must list members with whom you worked if you share solutions or solution outlines n Each student must write up and turn in their own solution separately n You may look at examples from class and other similar examples from any source cite appropriately n Note: University policy on plagiarism still holds - cite your sources if you are not the sole author of your solution 9/12/17 12

Programming Languages & Compilers Three Main Topics of the Course I New Programming Paradigm II Language Translation III Language Semantics 9/12/17 13

Programming Languages & Compilers Order of Evaluation I New Programming Paradigm II Language Translation III Language Semantics Specification to Implementation 9/12/17 14

Programming Languages & Compilers I : New Programming Paradigm Functional Programming Environments and Closures Patterns of Recursion Continuation Passing Style 9/12/17 15

Programming Languages & Compilers Order of Evaluation Functional Programming Environments and Closures Patterns of Recursion Continuation Passing Style Specification to Implementation 9/12/17 16

Programming Languages & Compilers II : Language Translation Lexing and Parsing Type Systems Interpretation 9/12/17 17

Programming Languages & Compilers Order of Evaluation Lexing and Parsing Type Systems Interpretation Specification to Implementation 9/12/17 18

Programming Languages & Compilers III : Language Semantics Operational Semantics Lambda Calculus Axiomatic Semantics 9/12/17 19

Programming Languages & Compilers Order of Evaluation Operational Semantics Lambda Calculus Axiomatic Semantics CS422 Specification to Implementation CS426 CS477 9/12/17 20

Course Objectives n New programming paradigm n n n n Functional programming Environments and Closures Patterns of Recursion Continuation Passing Style n Phases of an interpreter / compiler n n n Lexing and parsing Type systems Interpretation n Programming Language Semantics n n n Lambda Calculus Operational Semantics Axiomatic Semantics 9/12/17 21

OCAML n Locally: n Compiler is on the EWS-linux systems at /usr/local/bin/ocaml n Globally: n Main CAML home: http://ocaml.org n To install OCAML on your computer see: http://ocaml.org/docs/install.html 9/12/17 22

References for OCaml n Supplemental texts (not required): n The Objective Caml system release 4.05, by Xavier Leroy, online manual n Introduction to the Objective Caml Programming Language, by Jason Hickey n Developing Applications With Objective Caml, by Emmanuel Chailloux, Pascal Manoury, and Bruno Pagano, on O Reilly n Available online from course resources 9/12/17 23

OCAML Background n CAML is European descendant of original ML n American/British version is SML n O is for object-oriented extension n ML stands for Meta-Language n ML family designed for implementing theorem provers n It was the meta-language for programming the object language of the theorem prover n Despite obscure original application area, OCAML is a full general-purpose programming language 9/12/17 24

Features of OCAML n Higher order applicative language n Call-by-value parameter passing n Modern syntax n Parametric polymorphism n Aka structural polymorphism n Automatic garbage collection n User-defined algebraic data types n It s fast - winners of the 1999 and 2000 ICFP Programming Contests used OCAML 9/12/17 25

Why learn OCAML? n Many features not clearly in languages you have already learned n Assumed basis for much research in programming language research n OCAML is particularly efficient for programming tasks involving languages (eg parsing, compilers, user interfaces) n Industrially Relevant: Jane Street trades billions of dollars per day using OCaml programs n Similar languages: Microsoft F#, SML, Haskell, Scala 9/12/17 26

Session in OCAML % ocaml Objective Caml version 4.01 # (* Read-eval-print loop; expressions and declarations *) 2 + 3;; (* Expression *) - : int = 5 # 3 < 2;; - : bool = false 9/12/17 27

No Overloading for Basic Arithmetic Operations # 15 * 2;; - : int = 30 # 1.35 + 0.23;; (* Wrong type of addition *) Characters 0-4: 1.35 + 0.23;; (* Wrong type of addition *) ^^^^ Error: This expression has type float but an expression was expected of type int # 1.35 +. 0.23;; - : float = 1.58 9/12/17 28

No Implicit Coercion # 1.0 * 2;; (* No Implicit Coercion *) Characters 0-3: 1.0 * 2;; (* No Implicit Coercion *) ^^^ Error: This expression has type float but an expression was expected of type int 9/12/17 29

Sequencing Expressions # "Hi there";; (* has type string *) - : string = "Hi there" # print_string "Hello world\n";; (* has type unit *) Hello world - : unit = () # (print_string "Bye\n"; 25);; (* Sequence of exp *) Bye - : int = 25 9/12/17 30

Declarations; Sequencing of Declarations # let x = 2 + 3;; (* declaration *) val x : int = 5 # let test = 3 < 2;; val test : bool = false # let a = 1 let b = a + 4;; (* Sequence of dec *) val a : int = 1 val b : int = 5 9/12/17 31

Environments n Environments record what value is associated with a given identifier n Central to the semantics and implementation of a language n Notation ρ = {name 1 value 1, name 2 value 2, } Using set notation, but describes a partial function n Often stored as list, or stack n To find value start from left and take first match 9/12/17 32

Environments X è 3 y è 17 b è true name è Steve region è (5.4, 3.7)... id è {Name = Paul, Age = 23, SSN = 999888777} 9/12/17 33

Global Variable Creation # 2 + 3;; (* Expression *) // doesn t affect the environment # let test = 3 < 2;; (* Declaration *) val test : bool = false // ρ 1 = {test false} # let a = 1 let b = a + 4;; (* Seq of dec *) // ρ 2 = {b 5, a 1, test false} 9/12/17 34

Environments test è true a è 1 b è 5 9/12/17 35

New Bindings Hide Old // ρ 2 = {b 5, a 1, test false} let test = 3.7;; n What is the environment after this declaration? 9/12/17 36

New Bindings Hide Old // ρ 2 = {b 5, a 1, test false} let test = 3.7;; n What is the environment after this declaration? // ρ 3 = {test 3.7, a 1, b 5} 9/12/17 37

Environments test è 3.7 a è 1 b è 5 9/12/17 38

Now it s your turn You should be able to do WA1 Problem 1, parts (* 1 *) and (* 2 *) 9/12/17 39

Local Variable Creation a è 1 // ρ 3 = {test 3.7, a 1, b 5} # let b = 5 * 4 // ρ 4 = {b 20, test 3.7, a 1} in 2 * b;; a è 1 b è b è 205 - : int = 40 // ρ 5 = ρ 3 = {test 3.7, a 1, b 5} # b;; - : int = 5 test è 3.7 a è 1 test è 3.7 b è 5 test è 3.7 b è 5 9/12/17 40

Local let binding a è 1 // ρ 5 = {test 3.7, a 1, b 5} # let c = let b = a + a // ρ 6 = {b 2} + ρ 3 // ={b 2, test 3.7, a 1} in b * b;; val c : int = 4 // ρ 7 = {c 4, test 3.7, a 1, b 5} # b;; - : int = 5 test è 3.7 b è 5 9/12/17 41

Local let binding // ρ 5 = {test 3.7, a 1, b 5} # let c = let b = a + a // ρ 6 = {b 2} + ρ 3 // ={b 2, test 3.7, a 1} in b * b;; val c : int = 4 a è 1 a è 1 test è 3.7 b è 25 // ρ 7 = {c 4, test 3.7, a 1, b 5} # b;; - : int = 5 test è 3.7 b è 5 9/12/17 42

Local let binding // ρ 5 = {test 3.7, a 1, b 5} # let c = let b = a + a // ρ 6 = {b 2} + ρ 3 // ={b 2, test 3.7, a 1} in b * b;; val c : int = 4 a è 1 a è 1 test è 3.7 b è 25 a è 1 c è 4 // ρ 7 = {c 4, test 3.7, a 1, b 5} # b;; - : int = 5 test è 3.7 b è 5 test è 3.7 b è 5 9/12/17 43

Now it s your turn You should be able to do WA1 Problem 1, parts (* 3 *) and (* 4 *) 9/12/17 44

Booleans (aka Truth Values) # true;; - : bool = true # false;; - : bool = false // ρ 7 = {c 4, test 3.7, a 1, b 5} # if b > a then 25 else 0;; - : int = 25 9/12/17 45

Booleans and Short-Circuit Evaluation # 3 > 1 && 4 > 6;; - : bool = false # 3 > 1 4 > 6;; - : bool = true # (print_string "Hi\n"; 3 > 1) 4 > 6;; Hi - : bool = true # 3 > 1 (print_string "Bye\n"; 4 > 6);; - : bool = true # not (4 > 6);; - : bool = true 9/12/17 46

Now it s your turn You should be able to do WA1 Problem 1, part (* 5 *) 9/12/17 47

Tuples as Values // ρ 7 = {c 4, test 3.7, a 1, b 5} # let s = (5,"hi",3.2);; a è 1 val s : int * string * float = (5, "hi", 3.2) b è 5 test è 3.7 c è 4 // ρ 8 = {s (5, "hi", 3.2), c 4, test 3.7, a 1, b 5} a è 1 b è 5 s è (5, hi, 3.2) test è 3.7 c è 4 9/12/17 48

Pattern Matching with Tuples / ρ 8 = {s (5, "hi", 3.2), c 4, test 3.7, a 1, b 5} # let (a,b,c) = s;; (* (a,b,c) is a pattern *) val a : int = 5 val b : string = "hi" val c : float = 3.2 # let x = 2, 9.3;; (* tuples don't require parens in Ocaml *) b è hi val x : int * float = (2, 9.3) b è 5 a è 1 test è 3.7 c è 4 s è (5, hi, 3.2) b è hi a è 5 test è 3.7 s è (5, hi, 3.2) c è 3.2 a è 5 s è (5, hi, 3.2) x è (2, 9.3) test è 3.7 c è 3.2 9/12/17 49

Nested Tuples # (*Tuples can be nested *) let d = ((1,4,62),("bye",15),73.95);; val d : (int * int * int) * (string * int) * float = ((1, 4, 62), ("bye", 15), 73.95) # (*Patterns can be nested *) let (p,(st,_),_) = d;; (* _ matches all, binds nothing *) val p : int * int * int = (1, 4, 62) val st : string = "bye" 9/12/17 50

Now it s your turn You should be able to do WA1 Problem 1, part (* 6 *) 9/12/17 51

Functions # let plus_two n = n + 2;; val plus_two : int -> int = <fun> # plus_two 17;; - : int = 19 9/12/17 52

Functions let plus_two n = n + 2;; plus_two 17;; - : int = 19 9/12/17 53

Nameless Functions (aka Lambda Terms) fun n -> n + 2;; (fun n -> n + 2) 17;; - : int = 19 9/12/17 54

Functions # let plus_two n = n + 2;; val plus_two : int -> int = <fun> # plus_two 17;; - : int = 19 # let plus_two = fun n -> n + 2;; val plus_two : int -> int = <fun> # plus_two 14;; - : int = 16 First definition syntactic sugar for second 9/12/17 55

Using a nameless function # (fun x -> x * 3) 5;; (* An application *) - : int = 15 # ((fun y -> y +. 2.0), (fun z -> z * 3));; (* As data *) - : (float -> float) * (int -> int) = (<fun>, <fun>) Note: in fun v -> exp(v), scope of variable is only the body exp(v) 9/12/17 56

Values fixed at declaration time # let x = 12;; val x : int = 12 # let plus_x y = y + x;; val plus_x : int -> int = <fun> # plus_x 3;; X è 12 What is the result? 9/12/17 57

Values fixed at declaration time # let x = 12;; val x : int = 12 # let plus_x y = y + x;; val plus_x : int -> int = <fun> # plus_x 3;; - : int = 15 9/12/17 58

Values fixed at declaration time # let x = 7;; (* New declaration, not an update *) val x : int = 7 # plus_x 3;; What is the result this time? 9/12/17 59

Values fixed at declaration time # let x = 7;; (* New declaration, not an update *) val x : int = 7 X è 12 # plus_x 3;; X è 7 What is the result this time? 9/12/17 60

Values fixed at declaration time # let x = 7;; (* New declaration, not an update *) val x : int = 7 # plus_x 3;; - : int = 15 9/12/17 61

Question n Observation: Functions are first-class values in this language n Question: What value does the environment record for a function variable? n Answer: a closure 9/12/17 62

Save the Environment! n A closure is a pair of an environment and an association of a sequence of variables (the input variables) with an expression (the function body), written: f < (v1,,vn) exp, ρ f > n Where ρ f is the environment in effect when f is defined (if f is a simple function) 9/12/17 63

Closure for plus_x n When plus_x was defined, had environment: ρ plus_x = {, x 12, } n Recall: let plus_x y = y + x is really let plus_x = fun y -> y + x n Closure for fun y -> y + x: <y y + x, ρ plus_x > n Environment just after plus_x defined: {plus_x <y y + x, ρ plus_x >} + ρ plus_x 9/12/17 64

Now it s your turn You should be able to do WA1 Problem 1, parts (* 7 *) and (* 8 *) 9/12/17 65

Evaluation of Application of plus_x;; n Have environment: ρ = {plus_x <y y + x, ρ plus_x >,, y 3, } where ρ plus_x = {x 12,, y 24, } n Eval (plus_x y, ρ) rewrites to n App (Eval(plus_x, ρ), Eval(y, ρ)) rewrites to n App (<y y + x, ρ plus_x >, 3) rewrites to n Eval (y + x, {y 3} +ρ plus_x ) rewrites to n Eval (3 + 12, ρ plus_x ) = 15 9/12/17 66

Functions with more than one argument # let add_three x y z = x + y + z;; val add_three : int -> int -> int -> int = <fun> # let t = add_three 6 3 2;; val t : int = 11 # let add_three = fun x -> (fun y -> (fun z -> x + y + z));; val add_three : int -> int -> int -> int = <fun> Again, first syntactic sugar for second 9/12/17 67

Partial application of functions let add_three x y z = x + y + z;; # let h = add_three 5 4;; val h : int -> int = <fun> # h 3;; - : int = 12 # h 7;; - : int = 16 9/12/17 68

Functions as arguments # let thrice f x = f (f (f x));; val thrice : ('a -> 'a) -> 'a -> 'a = <fun> # let g = thrice plus_two;; val g : int -> int = <fun> # g 4;; - : int = 10 # thrice (fun s -> "Hi! " ^ s) "Good-bye!";; - : string = "Hi! Hi! Hi! Good-bye!" 9/12/17 69

Functions on tuples # let plus_pair (n,m) = n + m;; val plus_pair : int * int -> int = <fun> # plus_pair (3,4);; - : int = 7 # let double x = (x,x);; val double : 'a -> 'a * 'a = <fun> # double 3;; - : int * int = (3, 3) # double "hi";; - : string * string = ("hi", "hi") 9/12/17 70

Match Expressions # let triple_to_pair triple = match triple with (0, x, y) -> (x, y) (x, 0, y) -> (x, y) (x, y, _) -> (x, y);; Each clause: pattern on left, expression on right Each x, y has scope of only its clause Use first matching clause val triple_to_pair : int * int * int -> int * int = <fun> 9/12/17 71

Closure for plus_pair n Assume ρ plus_pair was the environment just before plus_pair defined n Closure for plus_pair: <(n,m) n + m, ρ plus_pair > n Environment just after plus_pair defined: {plus_pair <(n,m) n + m, ρ plus_pair >} + ρ plus_pair 9/12/17 72