Yu-Tzu Lin ( 林育慈 ) linyt.

42
Functional Programming Spring 2008 Yu-Tzu Lin ( 林林林 ) http://web.ntnu.edu.tw/~linyt

Transcript of Yu-Tzu Lin ( 林育慈 ) linyt.

  • Slide 1
  • Yu-Tzu Lin ( ) http://web.ntnu.edu.tw/~linyt
  • Slide 2
  • Information 2
  • Slide 3
  • Information (cont.) References ANSI Common LISP, by Paul Graham, Prentice Hall, 1995. (A good introductory book) LISP, by Patrick Henry Winston and Bertbold Klaus Paul Horn, Addison Wesley, 1989. (A quick guide to write Lisp) Introduction to functional programming, by Richard Bird and Philip Wadler, Prentice-Hall, 1988. Functional programming, by Jeroen Fokker, 1995. (Free for educational purposes) 3
  • Slide 4
  • Information (cont.) Grade Homework: 30% Midterm exam: 30% Final project: 40% "I can do everything through him who gives me strength Phillipians 4:13 4
  • Slide 5
  • Syllabus Introduction Lists Specialized Data Structures Control Functions Input and output Symbols Numbers Macros Structure 5
  • Slide 6
  • Introduction-Functional Programming Computers are expensive in early days make the programming language resemble the computer architecture imperative programming e.g. Pascal, C, Statement 1; Statement 2; Statement 3; Statement n; 6
  • Slide 7
  • Introduction-Functional Programming There were already methods to solve problems before the invention of computers Functions play a much more central roles Function Expresses the connection between parameters (input) and the result (output) Is a good way of specifying a computation 7 InputOutput Function Result=f(parameter 1, parameter 2, , parameter p)
  • Slide 8
  • Introduction-Functional Programming A functional program consists of the definition of one or more functions 8 Function 1 Function 2 Function 3 Function n
  • Slide 9
  • Introduction-Lisp Lisp was first conceived by John McCarthy in 1956 The first functional programming language Not the language satisfies all modern demands Other functional programming languages came to existence for different purposes ML Scheme (an adjustment to Lisp) Haskell Designed to evolve You can use Lisp to define new lisp operators 9
  • Slide 10
  • Introduction-Lisp Example 10 ; Lisp /* C */ (defun sum (n) int sum(int n){ (let ((s 0)) int i, s = 0; (dotimes (i n s) for (i = 0; i < n; i++) (incf s i ) ) ) ) s += i; return(s); }
  • Slide 11
  • Introduction-Lisp Start to write CLISP http://web.ntnu.edu.tw/~linyt/func_prog/CLisp.zip http://web.ntnu.edu.tw/~linyt/func_prog/cltl_ps.tar http://joung.im.ntu.edu.tw/teaching/pl/2001/Common_Lisp/readm e.html http://joung.im.ntu.edu.tw/teaching/pl/2001/Common_Lisp/readm e.html 11
  • Slide 12
  • Introduction-Lisp An interactive front-end (toplevel) > is the toplevel prompt > 1 (you type 1) 1 (the system print its value evaluate to itself) > (another prompt to say that its ready for more) > (+ 2 3) 5 + is the operator The numbers 2 and 3 are arguments Prefix notation 2 + 3 + 4 ? 12
  • Slide 13
  • Introduction-Lisp > (+) 0 > (+ 2) 2 > (+ 2 3) 5 > (+ 2 3 4 5) 14 13
  • Slide 14
  • Introduction-Atoms and Lists Expressions can be nested > (/ (-7 1) (- 4 2)) ? Lisp uses a single notation to express all ideas Atom List 14
  • Slide 15
  • Introduction-Evaluation (+ 2 3) + is a function 2 and 3 are arguments (+ 2 3) is a function call Function evaluation 1: the arguments are evaluated, from left to right 2: the values of the arguments are passed to the function named by the operator 15
  • Slide 16
  • Introduction-Evaluation (/ (- 7 1) (- 4 2)) 1: evaluate (- 7 1) 1.1: evaluate 7 1.2: evaluate 1 1.3: pass 7 and 1 to the function -, which returns 6 2: evaluate (- 4 2) 2.1: evaluate 4 2.2: evaluate 2 2.3: pass 4 and 2 to the function -, which returns 2 3: pass 6 and 2 to the function /, which returns 3 16
  • Slide 17
  • Introduction-Evaluation > (/ 1 0) Error: Division by zero. > (quote (+ 3 5)) (+ 3 5) > (+ 3 5) (+ 3 5) Quote takes a single argument and just returns it verbatim A way to protect expressions from evaluation 17
  • Slide 18
  • Introduction-Data Lisp offers all the data types we find in most other languages Integer e.g. 256 String e.g ora et labora Special data type Symbol Word List Is represented zero or more elements enclosed in parentheses 18
  • Slide 19
  • Introduction-Data Symbol Does not evaluate to itself If you want to refer to a symbol, you should quote it > Artichoke ARTICHOKE List The elements can be of any type, including lists You have to quote lists, or lisp would take them for functions calls > (my 3 Sons) (MY 3 Sons) > (the list (a b c) has 3 elements) (THE LIST (a b c) HAS 3 ELEMENTS) One quote protects a whole expression 19
  • Slide 20
  • Introduction-Data Build lists by calling list > (list my (+ 2 1) Sons) (MY 3 Sons) The list is evaluated to return The list itself if it is quoted Its value if it is not quoted > (list (+ 2 1) (+ 2 1)) ((+ 2 1) 3) Lisp programs are expressed as lists You can write programs to generate programs 20
  • Slide 21
  • Introduction-Data Empty list > ( ) NIL nil NIL You dont have to quote nil because nil evaluates to itself 21
  • Slide 22
  • Introduction-List Operators Cons (cons ) > (cons a (b c d)) (A B C D) > (cons a (cons b nil)) (A B) > (list a b) (A B) 22
  • Slide 23
  • Introduction-List Operators First > (first (fast computers are nice)) FAST Rest > (rest (fast computers are nice)) (COMPUTERS ARE NICE) Car > (car (a b c)) A > (cdr (a b c)) (B C) > (car (cdr (cdr (a b c d)))) C Cxxxxr x is a or d 23
  • Slide 24
  • Introduction-Truth The symbol t is the default representation for truth Like nil, t evaluates to itself (listp object) Returns true when object is a list > (listp (a b c)) T > (listp 27) NIL A function whose return value is intended to be interpreted as truth or falsity is called a predicate Common Lisp predicates often have names that end with p 24
  • Slide 25
  • Introduction-Truth (null object) Returns true when object is nil > (null nil) T (not object) Returns true when object is nil > (not nil) T 25
  • Slide 26
  • Introduction-Truth > (if (listp (a b c)) (+ 1 2) (+ 5 6)) 3 > (if (listp 27) (+ 1 2) (+ 5 6)) 11 > (if (listp 27) (+ 2 3)) NIL > (if 27 1 2) 1 Everything except nil also counts as true 26
  • Slide 27
  • Introduction-Truth (and expression) Evaluates the expression in order, returning nil immediately if one evaluates to nil, or if they all return true, the value of the last. Returns t if given no arguments. > (and t (+ 1 2)) 3 27
  • Slide 28
  • Introduction Exercises Describe what happens when the following expressions are evaluated (+ (- 5 1) (+ 3 7)) (list 1 (+ 2 3)) (if (listp 1) (+ 1 2) (+ 3 4)) (list (and (listp 3) t) (+ 1 2)) 28
  • Slide 29
  • Introduction-Functions defun > (defun our-fun (x) (car (cdr (cdr x)))) OUR-FUN > (our-fun (a b c d)) C A symbol has to be quoted because otherwise it will be treated as a variable > (> (+ 1 4) 3) T (defun sum-greater (x y z) (> (+ x y) z)) SUM-GREATER > (sum-greater 1 4 3) T 29
  • Slide 30
  • Introduction-Functions Lisp makes no distinction between a program, a procedure, and a function Functions do for everything 30
  • Slide 31
  • Introduction-Recursion (defun our-member (obj lst) (if (null lst) nil (if (eql (car lst) obj) lst (our-member obj (cdr lst))))) > (our-member b (a b c)) (B C) > (our-member z (a b c)) NIL 31
  • Slide 32
  • Introduction-Input and Output > (format t ~A plus ~A equals ~A. ~% 2 3 (+ 2 3 )) 2 plus 3 equals 5. NIL The first line is displayed by format The second line is the value returned by the call to format t indicates that the output is to be sent to standard output The second argument is a string that serves as a template for output ~% indicates a newline 32
  • Slide 33
  • Introduction-Input and Output Read No arguments Reads from the standard input (toplevel) (defun ask (string) (format t ~A string) (read)) > (ask How old are you?) How old are you? 20 20 33
  • Slide 34
  • Introduction-Variables Let One of the most frequently used operators in Common Lisp > (let ((x 1) (y 2)) (+ x y)) 3 (defun ask-number ( ) (format t Please enter a number. ) (let ((val (read))) (if (numberp val) val (ask-number)))) 34
  • Slide 35
  • Introduction-Variables Global variable > (defparameter *x* 32) *x* > *x* 32 (defconstant limit (+ *x* 1)) (boundp symbol) Returns true iff symbol is the name of a special variable > (boundp *x*) T 35
  • Slide 36
  • Introduction Exercises What does this function do? (defun enigma (x) (and (not (null x)) (or (null (car x)) (enigma (cdr x))))) 36
  • Slide 37
  • Introduction-Assignment > (setf *x* 98) 98 > (let ((n 10) (setf n 2) n) 2 > (setf x (list a b c)) (A B C) > (setf (car x ) n) N > x (N B C) 37
  • Slide 38
  • Introduction-Assignment (setf a b c d e f) (setf a b) (setf c d) (setf e f) 38
  • Slide 39
  • Introduction-Functional programming in Lisp Functional programming means writing programs that work by returning values, instead of by modifying things > (setf lst (c a r a t)) (C A R A T) > (remove a lst) (C R T) > lst (C A R A T) (setf new_x (remove a x)) 39
  • Slide 40
  • Introduction-Iteration (defun show-squares (start end) (do ((i start (+ i 1))) ((> i end) done) (format t ~A ~A~% i (* i i)))) > (show-squares 2 5) 2 4 3 9 4 16 5 25 DONE 40
  • Slide 41
  • Introduction-Functions as Objects In Lisp, functions are regular objects, like symbols or strings or lists (function function_name) Returns the function whose name is function_name > (function +) # > # + > (apply #+ (1 2 3)) 6 > (+ 1 2 3) 6 41
  • Slide 42
  • Introduction Exercises Mary is trying to write a function that returns the sum of all the non-nil elements in a list. Explain why this program cannot give a correct answer. (defun summit (lst) (remove nil lst) (apply #+ lst)) 42