Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
COP4020 Programming Languages Functional Programming Prof. Xin Yuan Topics Functional programming with Scheme Learn by examples 5/24/2017 COP4020 Spring 2014 2 Defining Global Names A global name is defined with the “define” special form (define name value) Usually the values are functions (lambda abstractions) Examples: 5/24/2017 (define my-name ''foo'') (define determiners '(''a'' ''an'' ''the'')) (define sqr (lambda (x) (* x x))) (define twice (lambda (f a) (f (f a)))) (twice sqr 3) ((lambda (f a) (f (f a))) (lambda (x) (* x x)) 3) … 81 COP4020 Spring 2014 3 Defining Global Names A global name defined with a lambda express in essence creates a named function. This allows recursion – one of the most important/useful concept in scheme. (define fab (lambda (x) (if (= x 0) 0 (if (=x 1) 1 (+ (fab (- x 1)) (fab (- x 2))))))) Define a function that computes the sum of all elements in a list. Define a function that put an element at the end of a list 5/24/2017 COP4020 Spring 2014 4 Load program from file Load function (load filename) load the program from a file (load “myscheme”): load the program in “myscheme.scm” After load, one has access to all global names in the program. 5/24/2017 COP4020 Spring 2014 5 I/O (display x) prints value of x and returns an unspecified value (newline) advances to a new line (read) returns a value from standard input (display "Hello World!") Displays: "Hello World!" (display (+ 2 3)) Displays: 5 (if (member (read) '(6 3 5 9)) "You guessed it!" "No luck") Enter: 5 Displays: You guessed it! (read-line) returns the string in a line (without the “\n”). 5/24/2017 COP4020 Spring 2014 6 I/O with files Open file for reading: (open-input-file filename) Open file for writing: (open-output-file filename) Read one character from a file: (read-char file) Read a scheme object from file: (read file) Check the current character in a file without consuming the character: (peek-char file) Check end-of-file: (eof-object? (peek-char file)) Write one character to a file: (write-char char file) Write a scheme object to file: (write object file) Close file: (close-port file) 5/24/2017 COP4020 Spring 2014 7 Blocks (begin x1 x2 … xn) sequences a series of expressions xi, evaluates them, and returns the value of the last one xn Examples: 5/24/2017 (begin (display "Hello World!") (newline) ) COP4020 Spring 2014 8 Example 1: define factorial function: fact(n) = 1*2*3*…*n 5/24/2017 COP4020 Spring 2014 9 Example 1: define factorial function: fact(n) = 1*2*3*…*n Recursive factorial: (define fact (lambda (n) (if (zero? n) 1 (* n (fact (- n 1)))) ) ) (fact 2) (if (zero? 2) 1 (* 2 (fact (- 2 1)))) (* 2 (fact 1)) (* 2 (if (zero? 1) 1 (* 1 (fact (- 1 1))))) (* 2 (* 1 (fact 0))) (* 2 (* 1 (if (zero? 0) 1 (* 0 (fact (- 0 1)))) (* 2 (* 1 1)) 2 5/24/2017 COP4020 Spring 2014 10 Example 2 Sum the elements of a list (define sum (lambda (lst) (if (null? lst) 0 (+ (car lst) (sum (cdr lst))) ) ) ) (sum '(1 2 3)) (+ 1 (sum (2 3)) (+ 1 (+ 2 (sum (3)))) (+ 1 (+ 2 (+ 3 (sum ())))) (+ 1 (+ 2 (+ 3 0))) 5/24/2017 COP4020 Spring 2014 11 Example 3 Generate a list of n copies of x (define fill (lambda (n x) ??? ) ) 5/24/2017 COP4020 Spring 2014 12 Example 3 Generate a list of n copies of x (define fill (lambda (n x) (if (= n 0) () (cons x (fill (- n 1) x))) ) ) (fill 2 'a) (cons a (fill 1 a)) (cons a (cons a (fill 0 a))) (cons a (cons a ())) (a a) 5/24/2017 COP4020 Spring 2014 13 Example 4 Replace x with y in list xs (define subst (lambda (x y xs) ??? ) ) 5/24/2017 COP4020 Spring 2014 14 Example 4 Replace x with y in list xs (define subst (lambda (x y xs) (cond ((null? xs) ()) ((eq? (car xs) x) (cons y (subst x y (cdr xs)))) (else (cons (car xs) (subst x y (cdr xs)))) ) ) ) 5/24/2017 COP4020 Spring 2014 15