Functional Programming. Introduction To Cool

Similar documents
Functional Programming. Introduction To Cool

Functional Programming. Introduction To Cool

Cunning Plan. One-Slide Summary. Functional Programming. Functional Programming. Introduction to COOL #1. Classroom Object-Oriented Language

Grade Weights. Language Design and Overview of COOL. CS143 Lecture 2. Programming Language Economics 101. Lecture Outline

History of Programming Languages. Functional Programming (1/2)

Winter Compiler Construction Who. Mailing list and forum

CS558 Programming Languages

History of Programming Languages. Functional Programming

Cunning Plan. Gone In Sixty Seconds. History of Programming Languages. Functional Programming. Functional Programming. Review and Administrivia

CSCI-GA Scripting Languages

CMSC330 Fall 2016 Midterm #1 2:00pm/3:30pm

CMSC 330: Organization of Programming Languages. OCaml Imperative Programming

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

CSE 341, Spring 2011, Final Examination 9 June Please do not turn the page until everyone is ready.

CMSC 330: Organization of Programming Languages. OCaml Imperative Programming

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

Introduction to Typed Racket. The plan: Racket Crash Course Typed Racket and PL Racket Differences with the text Some PL Racket Examples

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

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

Functional Programming. Big Picture. Design of Programming Languages

Recursive Types and Subtyping

CS 330 Lecture 18. Symbol table. C scope rules. Declarations. Chapter 5 Louden Outline

CS558 Programming Languages

CS 11 Ocaml track: lecture 2

CSC324- TUTORIAL 5. Shems Saleh* *Some slides inspired by/based on Afsaneh Fazly s slides

Types, Type Inference and Unification

Simply-Typed Lambda Calculus

CS 415 Midterm Exam Spring 2002

Topics Covered Thus Far CMSC 330: Organization of Programming Languages

ML Type Inference and Unification. Arlen Cox

OCaml. ML Flow. Complex types: Lists. Complex types: Lists. The PL for the discerning hacker. All elements must have same type.

Homework 3 COSE212, Fall 2018

SNU Programming Language Theory

The Typed Racket Guide

Semester Review CSC 301

Compiler construction 2009

CS 430 Spring Mike Lam, Professor. Data Types and Type Checking

CS164: Programming Assignment 5 Decaf Semantic Analysis and Code Generation

Ruby: Introduction, Basics

Data Abstraction. Hwansoo Han

type environment updated subtype sound

So what does studying PL buy me?

CMSC 330: Organization of Programming Languages

Types and Type Inference

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

Typed Racket: Racket with Static Types

Recap. Recap. If-then-else expressions. If-then-else expressions. If-then-else expressions. If-then-else expressions

Lexical Analysis. Lecture 3. January 10, 2018

OCaml Data CMSC 330: Organization of Programming Languages. User Defined Types. Variation: Shapes in Java

Tuples. CMSC 330: Organization of Programming Languages. Examples With Tuples. Another Example

Haske k ll An introduction to Functional functional programming using Haskell Purely Lazy Example: QuickSort in Java Example: QuickSort in Haskell

Programming Languages and Techniques (CIS120)

CS-XXX: Graduate Programming Languages. Lecture 22 Class-Based Object-Oriented Programming. Dan Grossman 2012

CPSC 3740 Programming Languages University of Lethbridge. Data Types

Exam 1 Format, Concepts, What you should be able to do, and Sample Problems

cs242 Kathleen Fisher Reading: Concepts in Programming Languages, Chapter 6 Thanks to John Mitchell for some of these slides.

Background. CMSC 330: Organization of Programming Languages. Useful Information on OCaml language. Dialects of ML. ML (Meta Language) Standard ML

An introduction introduction to functional functional programming programming using usin Haskell

CS321 Languages and Compiler Design I Winter 2012 Lecture 13

Names, Scopes, and Bindings. CSE 307 Principles of Programming Languages Stony Brook University

COSE212: Programming Languages. Lecture 4 Recursive and Higher-Order Programming

1. true / false By a compiler we mean a program that translates to code that will run natively on some machine.

Outline. Java Models for variables Types and type checking, type safety Interpretation vs. compilation. Reasoning about code. CSCI 2600 Spring

Type Systems, Type Inference, and Polymorphism

More Static Semantics

Names, Scopes, and Bindings. CSE 307 Principles of Programming Languages Stony Brook University

CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures. Dan Grossman Autumn 2018

CS558 Programming Languages

CSE 307: Principles of Programming Languages

CMSC 330: Organization of Programming Languages. Functional Programming with Lists

Design Issues. Subroutines and Control Abstraction. Subroutines and Control Abstraction. CSC 4101: Programming Languages 1. Textbook, Chapter 8

CSE341: Programming Languages Lecture 9 Function-Closure Idioms. Dan Grossman Winter 2013

Comp 311 Principles of Programming Languages Lecture 21 Semantics of OO Languages. Corky Cartwright Mathias Ricken October 20, 2010

CIS 194: Homework 3. Due Wednesday, February 11, Interpreters. Meet SImPL

CMSC330. Objects, Functional Programming, and lambda calculus

One-Slide Summary. Lecture Outine. Automatic Memory Management #1. Why Automatic Memory Management? Garbage Collection.

Intro. Scheme Basics. scm> 5 5. scm>

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

Concepts of Programming Languages

More Static Semantics. Static. One-Slide Summary. Lecture Outline. Typing Rules. Dispatch Rules SELF_TYPE

Some instance messages and methods

Lecture: Functional Programming

News. Programming Languages. Recap. Recap: Environments. Functions. of functions: Closures. CSE 130 : Fall Lecture 5: Functions and Datatypes

CS 11 Haskell track: lecture 1

22c:111 Programming Language Concepts. Fall Types I

CS Lecture 6: Map and Fold. Prof. Clarkson Spring Today s music: Selections from the soundtrack to 2001: A Space Odyssey

NOTE: Answer ANY FOUR of the following 6 sections:

CIS 120 Midterm II November 16, 2012 SOLUTIONS

Type Checking and Type Inference

Week 7. Statically-typed OO languages: C++ Closer look at subtyping

Programming Languages and Techniques (CIS120)

Some Advanced ML Features

CMSC 330: Organization of Programming Languages. OCaml Expressions and Functions

CSCI312 Principles of Programming Languages!

Scoping rules match identifier uses with identifier definitions. A type is a set of values coupled with a set of operations on those values.

Functional Programming

Scheme as implemented by Racket

Recap from last time. Programming Languages. CSE 130 : Fall Lecture 3: Data Types. Put it together: a filter function

Harvard School of Engineering and Applied Sciences CS 152: Programming Languages

Passing Out Review Forms

Transcription:

Functional Programming Introduction To Cool #1

Cunning Plan ML Functional Programming Fold Sorting Cool Overview Syntax Objects Methods Types #2

One-Slide Summary In functional programming, functions are first-class citizens that operate on, and produce, immutable data. Functions and type inference are polymorphic and operate on more than one type (e.g., List.length works on int lists and string lists). Ocaml and Haskell (and Cool) support pattern matching over user-defined data types. fold is a powerful and general higher-order function. It can simulate many others. Cool is an object-oriented language with enough features to be indicative of modern practice. #3

2015 PA1c Submission Statistics Students Taking Class for Credit: 32+8 Students Submitting > 0 Times: 32 Language choice, as of Tuesday morning Python Ruby JavaScript C OCaml Haskell Cool 25 25 21 17 8 4 2 Which of these languages are the most important in the course? #4

PS1 Pedagogy Why target old languages? Python 2.4 vs. 2.6, Ruby 1.8.5 vs. 1.9, etc. Real-world customer machine scenario Exposure to costs of adding language features {C, Ocaml, Cool } vs. { Python, Ruby } vs. { Haskell }, specs Toposort Algorithm vs. Language, Syntax, Run-Time System, Operating System, Testing and Debugging Whitespace doens't matter vs. You write printf Black box testing and debugging http://www.st.cs.uni-saarland.de/dd/ http://www.whyprogramsfail.com/ #5

Shared Pain with Ruby 1.8.5 # RUBY: Reverse-sort the lines from standard input lines = [ ] # a list variable to hold all the lines we'll read in working = true # are there still more lines to read in? while working line = gets # read a line from standard input if line == nil # nil is "nothing, it didn't work" working = false # we're done reading stuff else lines[lines.length] = line # append 'line' to the end of 'lines end # end of 'if' end # end of 'while' sorted = lines.sort do a,b # sort the list of lines # this do block is basically an anonymous function! # foo,bar means "foo and bar are the arguments" # we will tell it how to compare to arbitrary elements, a and b b <=> a # <=> means "compare" -- we'll do it in reverse end # end 'do' sorted.map{ one_line, i # iterate over each statement in sorted list puts one_line # write it to standard output } # end 'iteration' #6

This is my final day... as your... companion... through Ocaml and Cool. After this we start the interpreter project. Clearly a third day would just be unthinkable. #7

Pattern Matching (Error?) Simplifies Code (eliminates ifs, accessors) type btree = (* binary tree of strings *) Node of btree * string * btree Leaf of string let rec height tree = match tree with Leaf _ -> 1 Node(x,_,y) -> 1 + max (height x) (height y) let rec mem tree elt = match tree with Leaf str Node(_,str,_) -> str = elt Node(x,_,y) -> mem x elt mem y elt #8

Pattern Matching (Error?) Simplifies Code (eliminates ifs, accessors) type btree = (* binary tree of strings *) Node of btree * string * btree Leaf of string let rec height tree = match tree with Leaf _ -> 1 Node(x,_,y) -> 1 + max (height x) (height y) let rec mem tree elt = match tree with bug? Leaf str Node(_,str,_) -> str = elt Node(x,_,y) -> mem x elt mem y elt #9

Pattern Matching (Error!) Simplifies Code (eliminates ifs, accessors) type btree = (* binary tree of strings *) Node of btree * string * btree Leaf of string let rec bad tree elt = match tree with Leaf str Node(_,str,_) -> str = elt Node(x,_,y) -> bad x elt bad y elt let rec mem tree elt = match tree with Leaf str Node(_,str,_) when str = elt -> true Node(x,_,y) -> mem x elt mem y elt #10

Recall: Polymorphism Functions and type inference are polymorphic Operate on more than one type let rec length x = match x with means any [] -> 0 one type hd :: tl -> 1 + length tl val length : list -> int length [1;2;3] = 3 length [ algol ; smalltalk ; ml ] = 3 length [1 ; algol ] = type error! #11

Recall: Higher-Order Functions Function are first-class values Can be used whenever a value is expected Notably, can be passed around Closure captures the environment let rec map f lst = match lst with f is itself a [] -> [] function! hd :: tl -> f hd :: map f tl val map : ( -> ) -> list -> list let offset = 10 in let myfun x = x + offset in val myfun : int -> int map myfun [1;8;22] = [11;18;32] Extremely powerful programming technique General iterators Implement abstraction #12

Recall: Fold The fold operator comes from Recursion Theory (Kleene, 1952) let rec fold f acc lst = match lst with val fold : ( -> -> ) -> -> list -> Imagine we re summing a list (f = addition): 9 2 7 4 5 acc lst 11 7 4 5 f 18 4 5 27 #13

Referential Transparency To find the meaning of a functional program we replace each reference to a variable with its definition. This is called referential transparency. Example: let y = 55 let f x = x + y f3 --> means --> 3 + y --> means --> 3 + 55 #14

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 1 [8;6;7] #15

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 1 [8;6;7] match lst with #16

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 1 [8;6;7] with f=*, acc=1, and lst=[8;6;7] match lst with #17

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 1 [8;6;7] match [8;6;7] with [] -> 1 hd :: tl -> fold (*) (* 1 hd) tl #18

Worked Example: Product let rec fold f acc lst = match lst with match [8;6;7] with [] -> 1 hd :: tl -> fold (*) (* 1 hd) tl #19

Worked Example: Product let rec fold f acc lst = match lst with let hd :: tl = [8;6;7] in fold (*) (* 1 hd) tl match [8;6;7] with [] -> 1 hd :: tl -> fold (*) (* 1 hd) tl #20

Worked Example: Product let rec fold f acc lst = match lst with let hd :: tl = [8;6;7] in fold (*) (* 1 hd) tl #21

Worked Example: Product let rec fold f acc lst = match lst with let hd :: tl = [8;6;7] in fold (*) (* 1 hd) tl fold (*) (* 1 8) [6;7] #22

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 8 [6;7] #23

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 8 [6;7] with f=*, acc=8, and lst=[6;7] match lst with #24

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 8 [6;7] match [6;7] with [] -> 8 hd :: tl -> fold (*) (* 8 hd) tl #25

Worked Example: Product let rec fold f acc lst = match lst with match [6;7] with [] -> 8 hd :: tl -> fold (*) (* 8 hd) tl #26

Worked Example: Product let rec fold f acc lst = match lst with let hd :: tl = [6;7] in fold (*) (* 8 hd) tl match [6;7] with [] -> 8 hd :: tl -> fold (*) (* 8 hd) tl #27

Worked Example: Product let rec fold f acc lst = match lst with let hd :: tl = [6;7] in fold (*) (* 8 hd) tl #28

Worked Example: Product let rec fold f acc lst = match lst with let hd :: tl = [6;7] in fold (*) (* 8 hd) tl fold (*) (* 8 6) [7] #29

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 48 [7] #30

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 48 [7] with f=*, acc=48, and lst=[7] match lst with #31

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 48 [7] match [7] with [] -> 48 hd :: tl -> fold (*) (* 48 hd) tl #32

Worked Example: Product let rec fold f acc lst = match lst with match [7] with [] -> 48 hd :: tl -> fold (*) (* 48 hd) tl #33

Worked Example: Product let rec fold f acc lst = match lst with let hd :: tl = [7] in fold (*) (* 48 hd) tl match [7] with [] -> 48 hd :: tl -> fold (*) (* 48 hd) tl #34

Worked Example: Product let rec fold f acc lst = match lst with let hd :: tl = [7] in fold (*) (* 48 hd) tl #35

Worked Example: Product let rec fold f acc lst = match lst with fold (*) (* 48 7) [] #36

Worked Example: Product let rec fold f acc lst = match lst with fold (*) 336 [] with f=*, acc=336, and lst=[] match lst with #37

Worked Example: Product let rec fold f acc lst = match lst with match [] with [] -> 336 hd :: tl -> fold (*) (* 336 hd) tl #38

Worked Example: Product let rec fold f acc lst = match lst with 336 match [] with [] -> 336 hd :: tl -> fold (*) (* 336 hd) tl #39

Worked Example: Product let rec fold f acc lst = match lst with 336 #40

Insertion Sort in OCaml let rec insert_sort cmp lst = match lst with [] -> [] hd :: tl -> insert cmp hd (insert_sort cmp tl) and insert cmp elt lst = match lst with What's the worst case running time? [] -> [elt] hd :: tl when cmp hd elt -> hd :: (insert cmp elt tl) _ -> elt :: lst #41

Sorting Examples langs = [ fortran ; algol ; c ] courses = [ 216; 333; 415] sort (fun a b -> a < b) langs [ algol ; c ; fortran ] sort (fun a b -> a > b) langs [ fortran ; c ; algol ] Java uses Inner Classes for this. sort (fun a b -> strlen a < strlen b) langs [ c ; algol ; fortran ] sort (fun a b -> match is_odd a, is_odd b with true, false -> true (* odd numbers first *) false, true -> false (* even numbers last *) _, _ -> a < b (* otherwise ascending *)) courses [ 333 ; 415 ; 216 ] #42

Modern Languages This is the most widely-spoken first language in the European Union. It is the third-most taught foreign language in the Englishspeaking world, after French and Spanish. Its word order is a bit more relaxed than English (since nouns are inflected to indicate their cases, as in Latin) infamously, verbs often appear at the very end of a subordinate clause. The language's famous Storm and Stress movement produced classics such as Faust. #44

Natural Languages This linguist and cognitive scientist is famous for, among other things, the sentence Colorless green ideas sleep furiously. Introduced in his 1957 work Syntactic Structures, the sentence is correct but has not understandable meaning, thus demonstrating the distinction between syntax and semantics. Compare Time flies like an arrow; fruit flies like a banana. which illustrates garden path syntactic ambiguity. #45

Cool Overview Classroom Object-Oriented Language Design to Be implementable in one semester Give a taste of implementing modern features Abstraction Static Typing Inheritance Dynamic Dispatch And more... But many grungy things are left out #46

A Simple Example class Point { x : Int <- 0; y : Int <- 0; }; Cool programs are sets of class definitions A special Main class with a special method main Like Java class = a collection of fields and methods Instances of a class are objects #47

Cool Objects class Point { x : Int <- 0; y : Int; (* use default value *) }; The expression new Point creates a new object of class Point An object can be thought of as a record with a slot for each attribute (= field) x 0 y 0 #48

Methods class Point { x : Int <- 0; y : Int <- 0; movepoint(newx : Int, newy : Int) : Point { { x <- newx; y <- newy; self; } -- close block expression }; -- close method }; -- close class A class can also define methods for manipulating its attributes Methods refer to the current object using self #49

Aside: Semicolons class Point { x : Int <- 0; y : Int <- 0; movepoint(newx : Int, newy : Int) : Point { { x <- newx; y <- newy; self; } -- close block expression }; -- close method }; -- close class Yes, it's somewhat arbitrary. Still, don't get it wrong. #50

Information Hiding Methods are global Attributes are local to a class They can only be accessed by that class's methods class Point { x : Int <- 0; y : Int <- 0; getx () : Int { x } ; setx (newx : Int) : Int { x <- newx }; }; #51

Methods and Object Layout Each object knows how to access the code of its methods As if the object contains a slot pointing to the code x y getx setx 0 0 * * In reality, implementations save space by sharing these pointers among instances of the same class x y methods 0 0 * getx setx #52

Inheritance We can extend points to color points using subclassing => class hierarchy class ColorPoint extends Point { color : Int <- 0; movepoint(newx:int, newy:int) : Point { { color <- 0; x <- newx; y <- newy; self; } Note references to fields x y They're defined in Point! }; }; x 0 y 0 color 0 movepoint * #53

Kool Types Every class is a type Base (built-in, predefined) classes: Int Bool String Object for integers for booleans: true, false for strings root of class hierarchy All variables must be declared compiler infers types for expressions (like Java) #54

Cool Type Checking x : Point; x <- new ColorPoint;... is well-typed if Point is an ancestor of ColorPoint in the class hierarchy Anywhere a Point is expected, a ColorPoint can be used (Liskov,...) Rephrase:... is well-typed if ColorPoint is a subtype of Point Type safety: a well-typed program cannot result in run-time type errors #55

Method Invocation and Inheritance Methods are invoked by (dynamic) dispatch Understanding dispatch in the presence of inheritance is a subtle aspect of OO p : Point; p <- new ColorPoint; p.movepoint(1,2); p has static type Point p has dynamic type ColorPoint p.movepoint must invoke ColorPoint version #56

Other Expressions Cool is an expression language (like Ocaml) Every expression has a type and a value Conditionals if E then E else E fi Loops while E loop E pool Case/Switch case E of x : Type => E ;... esac Assignment x <- E Primitive I/O out_string(e), in_string(),... Arithmetic, Logic Operations,... Missing: arrays, floats, interfaces, exceptions Plus: you tell me! #57

Cool Memory Management Memory is allocated every time new E executes Memory is deallocated automatically when an object is not reachable anymore Done by a garbage collector (GC) #58

Course Project A complete interpreter Cool Source ==> Executed Program No optimizations Also no GC Split in 4 programming assignments (PAs) There is adequate time to complete assignments But start early and follow directions PA2-5 ==> individual or teams (of max 2) (Compilers: Also alone or teams of two.) #59

Real-Time OCaml Demo I will code up these, with explanations, until time runs out. Read in a list of integers and print the sum of all of the odd inputs. Read in a list of integers and determine if any sublist of that input sums to zero. Read in a directed graph and determine if node END is reachable from node START. You pick the order. Bonus: Asymptotic running times? #60

Homework PA1 Due Reading: Chapters 2.1 2.2, On-Line Bonus for getting this far: questions about fold are very popular on tests! If I say write me a function that does foozle to a list, you should be able to code it up with fold. #61