Functional Programming Language – Scheme

Download Report

Transcript Functional Programming Language – Scheme

Programming Languages and
Design
Lecture 4
Functional Programming – Scheme
Instructor: Li Ma
Department of Computer Science
Texas Southern University, Houston
September, 2010
Review of Previous Lectures
 Introduction to programming languages
Fundamental concepts
Computation models/Programming paradigms
Language Design Issues and Questions
Program processing
 Syntax specifications of programming languages
 Semantic specifications of programming
languages
2
Today’s Lecture
 Review the categories of programming languages
 Functional Programming
 Properties
 Lambda calculus
 Scheme
 Function definitions and examples
 References
 “Programming Language Pragmatics”, Michael Scott, Chapter 10
 “Foundations of Programming Languages: Design and
Implementation”, S. H. Roosta, Chapter 12 & 13 (§13.2)
3
Categories of Programming
Languages
 All languages fall into one of the following two
categories:
 Imperative languages require programmers to describe, stepby-step, how an algorithm should do its work
 Real world analogy » A recipe is a type of imperative program that
tells a cook how to prepare a dish
 Declarative languages allow programmers to describe what an
algorithm should do without having to specify exactly how it
should do
 Real world analogy » The recent Pfand law is a declarative program
that tells retailers that they must institute a recycling program for the
einweg Flasche and Dosen that they sell, without telling them
exactly how to do it
4
Imperative Languages
 The von Neumann languages
 include Fortran, Pascal, Basic, C
 are a reflection of the von Neumann computer architectures on
which their programs run
 A single CPU sequentially carries out instructions
 are also called the procedural languages
 A sequence of statements represent commands
 Execute statements which alter the program’s state
(variables/memory)
 Sometimes called computing by side effects
 Example: summing the first n integers in C
 for(sum=0,i=1;i<=n;i++) { sum += i; }
5
Imperative Languages (cont’)
 The object-oriented languages
 include Smalltalk, C++, Java, CLOS
 are similar to the von Neumann languages with the addition of
objects
 Objects:
 Contain their own internal state (member variables) and functions
which operate on that state (methods)
 Computation is organized as interactions between objects (one
object calling another’s methods)
 Most object-oriented languages provide facilities based on
objects that encourage object-oriented programming
 Encapsulation, inheritance, and polymorphism
6
Declarative Languages
 The functional languages
 include LISP/Scheme, ML, Haskell
 are a reflection of Alonzo Church’s theory of recursive functions
(lambda calculus)
 Computation carried out as functions return values based on the
(possibly recursive) evaluation of other functions
 Mechanism known as reduction
 No side effects!
 Permits equational reasoning, easier formal proofs of program
correctness, etc.
 Example: summing the first n integers in SML
 fun sum (n) = if n <= 1 then n else n + sum(n-1)
7
Declarative Languages (cont’)
 The logic languages
 include Prolog, SQL, Microsoft Excel
 are also called descriptive language
 Only describe known facts and relationships about a problem
 Not prescribe the sequence of steps to solve the problem
 are a reflection of the theory of propositional logic
 Computation is an attempt to find values which satisfy a set of
logical relationships
 Mechanism most commonly used to find these values is known as
resolution and unification
 Example: summing the first n integers in Prolog
 sum(1,1).
 sum(N,S) :- N1 is N-1, sum(N1,S1), S is S1+N.
8
Languages for Programming
Paradigms
 Different languages provide facilities to
encourage different programming models
Imperative/procedure programming
 Fortran, Pascal, Basic, C
Object-Oriented programming
 Smalltalk, C++, Java, CLOS
Functional programming
 LISP/Scheme, ML, Haskell
Logic programming
 Prolog, SQL, Microsoft Excel
9
Functional Programming
 Based on mathematical functions
 Take argument, return value
 Only function call, no assignment
 Functions are first-class values
 Use a function as an argument to another function
 Functions can return functions
 No side effects
 No change for internal state of computation
 Dynamic memory management
 Requires garbage collection
 Reclaim the inaccessible storage
10
Lambda Calculus
 Mathematical functional language
 Used for studying functional programming language
concepts
 All functional programming languages can be viewed as
syntactic variation of lambda calculus
 Language constructs
 Variables: x
 Primitive functions: *
 Function abstraction:  (x) x*x or  x.x*x
 Function call: f (x) or f x
 Example
 ( (x) x*x*x) (2) yields 8
11
Scheme
 A dialect of LISP (from MIT, 1975)
 Lists as built-in data type
A sequence of expressions separated by spaces and
surrounded by parentheses
 Same syntax for lists and programs
 Functions are (first-class) data
 Dynamic typing, need type checking
 Recursion is used for loops of read-evaluateprint
12
Scheme Syntax
 The basic object in Scheme is symbolic
expression (S-expression)
 An S-expression is defined recursively
An atomic symbol is an S-expression
If expression1 and expression2 are S-expressions, so
is (expression1 expression2)
S-expression ::= literals
| symbols
| (s-expression . . .)
 Special forms for specific language constructs
13
Atomic Data Types
 Numbers
3.14, 42, -4101
 Booleans
#t, #f
 Characters, Strings
#\a, #\newline, “Hello World”
 Symbols
f, x, +, *, foo, bar, null?, set!
14
Variable Definitions
 Variable definitions
(define x 3)
(define y 5)
; associate the value 3 with the name x
; associate the value 5 with the name y
 This is not an assignment!
A new variable is defined
Like ‘int x = 3;’ in C
15
Functions
 Function definition
(define (double x) (+ x x))
 Function application (call)
(* 3 4)
; return 12
(+ 2 x y)
(double 3)
; return 6
(* (+ 3 4) (double 3))
; return 42
16
Anonymous Functions
 Anonymous function definitions
Use lambda calculus or other predefined functions
 Other way for function definitions
(define double (lambda (x) (+ x x)))
(define (second lst) (car (cdr lst)))
 Function application/call
(double 3)
; return 6
((lambda (x) (+ x x)) 3)
(second ‘((A) (B) (C)))
; return 6
; return (B)
17
Lists
 Quotes (not to be evaluated)
(quote x), ’x
 Empty list
’(), often assigned to the variable nil
 Nonempty list
’(1 2 3), ’(a b 3), ’(1 (2 3) 4)
18
List Representation (1)
 The list ’(1 2) is stored as
cons
/
\
1
cons
/
\
2
()
19
List Representation (2)
 The list ’(1 (2 3) 4) is stored as
cons
/
\
1
cons
/
\
cons
cons
/
\
/
\
2 cons 4
()
/
\
3
()
20
List Functions
 Predefined functions
car, cdr, cons
 Examples
(car ’(1 2)) returns 1
(cdr ’(1 2)) returns (2)
(cons 1 ’(2)) returns (1 2)
(cons 1 2) returns (1 . 2)
21
Lists vs. S-Expressions
List Syntax
S-Expression Syntax
(1 2 3)
(1 . (2 . (3 . ())))
((1 2))
((1 . (2 . ())) . ())
(1 . 2) is NOT a list!!
22
More Examples (1)
Expression
(- 24 (* 4 3))
(car (cdr ’(1 2 3)))
(cadr ’(1 2 3))
(cons 1 ’())
(cons 1 2)
(cons ’() ’())
(car ’(()))
Value
12
2
2
(1)
(1 . 2)
(())
()
23
More Examples (2)
Expression
(define x 3)
(+ x 2)
’x
(double x)
’(double x)
(* (- x) 7)
Value
5
x
6
(double x)
-42
24
More List Functions
Expression
(null? ’())
(null? ’(a b))
(list 1)
(list ’a ’b ’c)
(append ’(1) ’(2))
(map double ’(1 2 3))
Value
#t
#f
(1)
(a b c)
(1 2)
(2 4 6)
25
Higher-Order Functions
(define (twice f x) (f (f x)))
or
(define twice (lambda (f x) (f (f x))))
(twice double 2) ; returns 8
(twice (lambda (x) (* x x)) 2) ; returns 16
26
Higher-Order Functions (cont’)
;; Curried version of twice
(define (twice f) (lambda (x) (f (f x))))
(define quadruple (twice double))
(quadruple 2) ; returns 8
((twice double) 2) ; returns 8
((twice quadruple) 2) ; returns 32
((twice (twice double)) 2) ; returns 32
27
Curried Function in C Syntax
(int (*) (int))
twice (int (*f) (int)) {
int foo (int x) {
return f(f(x));
}
return foo;
}
(twice(double)) (2);
28
Conditionals
 if-then-else
(if (= x y) 1 2)
; in C: (x == y) ? 1 : 2
 cond
(cond ((= x y) 1)
((< x y) 2)
(else 3))
 Anything non-#f is considered true
(if 1 2 3) ; returns 2, so true
29
Equality
Expression
(eq? x x)
(eq? ’x ’x)
(eq? ’() ’())
(eq? 2 2)
(eq? (list 1) ’(1))
Value
#t
#t
#t
undefined
#f
(eqv? 2 2)
(equal? (list 1) ’(1))
#t
#t
30
Recursion
(define (fac n)
(if (= n 0)
1
(* n (fac (- n 1)))))
(fac 5) ; returns 120
(fac 1000) ; that’s 2568 digits
31
Map Function
(define (mymap f l)
(if (null? l) ’()
(cons (f (car l))
(mymap f (cdr l)))))
(mymap double ’(1 2 3 4 5))
; returns (2 4 6 8 10)
(mymap (lambda (x) (+ x 1)) ’(1 2))
; returns (2 3)
32
Let
 Defines local name binding
(let ((x 3)
(y 5))
(* x y))
 Syntactic sugar for function call
((lambda (x y) (* x y)) 3 5)
33
Quicksort
 Problem: sort list of numbers
 Algorithm:
If list is empty, we are done
Choose pivot n (e.g., first element)
Partition list into lists A and B with elements < n in A
and elements > n in B
Recursively sort A and B
Append sorted lists and n
34
Quicksort (cont)
(define (quicksort ls)
(if (null? ls) ’()
(let ((p (car ls)))
(append
(quicksort (gt p (cdr ls)))
(list p)
(quicksort (le p (cdr ls)))))))
35
Partitioning
(define (gt p ls)
(filter (lambda (x) (> p x)) ls))
(define (le p ls)
(filter (lambda (x) (<= p x)) ls))
36
Filtering a List
(define (filter pred ls)
(cond ((null? ls) ’())
((pred (car ls))
(cons (car ls)
(filter pred (cdr ls))))
(else (filter pred (cdr ls)))))
37