Presentation is loading. Please wait.

Presentation is loading. Please wait.

CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt1 CSCI 2210: Programming in Lisp Programming Techniques Data Structures More Built-in.

Similar presentations


Presentation on theme: "CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt1 CSCI 2210: Programming in Lisp Programming Techniques Data Structures More Built-in."— Presentation transcript:

1 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt1 CSCI 2210: Programming in Lisp Programming Techniques Data Structures More Built-in Functions

2 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt2 Functional Programming  Functional Programming  Writing programs that return values –Instead of modifying things (side effects) –Avoid things like setf  Dominant paradigm in Lisp  Allows interactive testing –Can immediately test anything at any time –Don't have to worry that it will mess up some "state" –Don't have long edit-compile-run cycle –Compare this to testing in other languages

3 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt3 Functions as Objects  Functions are regular objects  Function  Returns the object associated with the function > (function +) #  Can use #' macro as a convenience > #'+ #  Example > (funcall #'+ 1 2 3) > (apply #'+ '(1 2 3)) ; Note: These are equivalent to (+ 1 2 3)

4 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt4 Funcall  Funcall –Template (funcall #' … ) Calls the specified procedure with the given argments –Equivalent to ( … ) –Example > (funcall #'+ 3 2 7) ;; Same as (+ 3 2 7) 12 –Example 2 > (defun eval-infix (arg1 operator arg2) (funcall operator arg1 arg2)) > (eval-infix 3 #'+ 2)  Useful if you need to pass in a procedure name, to be applied at a future time

5 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt5 Apply  Apply  Similar to Funcall  (typically) takes two arguments, –procedure object –list of arguments to be passed to procedure object (funcall #'+ 3 2 7) ;; Same as (+ 3 2 7) (apply #'+ '(3 2 7)) ;; Same as (+ 3 2 7)  Apply can actually take additional arguments –Extra arguments are combined into a single list –Following are equivalent (apply #'+ '(1 2 3 4 5 6)) (apply #'+ 1 2 3 '(4 5 6)) Argument fed to + is (append (list 1 2 3) ‘(4 5 6))

6 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt6 Data Representation Using Lists  Record information about courses  Basic definition > (setf lisp-course-info '(CSCI221001 ; course number (Programming in Lisp); course name (Alok Mehta); instructor (Computer Science))); department (CSCI221001 (PROGRAMMING IN LISP) … )  What is the name of the course ‘lisp-course-info’? > (second lisp-course-info) (PROGRAMMING IN LISP)  Poor practice - Depends on the ordering of the list  What if the order changes, or you need to add something

7 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt7 Modified Course Structure  Example, if we need to add credit hours information (setf lisp-course-info '(CSCI221001 1; Credit hours (Programming in Lisp); Course name (Alok Mehta); Instructor (Computer Science))); Department  All programs that access name of course-1 have to change from using SECOND to using THIRD > (third lisp-course-info)

8 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt8 Association Lists  Better way to represent data: Association Lists (setf lisp-course-info '( (course-number CSCI221001) (credit-hours 1) (name (Programming in Lisp)) (instructor (Alok Mehta)) (department (Computer Science))))  What is the name of ‘lisp-course-info’? > (second (third lisp-course-info)) (PROGRAMMING IN LISP) > (assoc 'name lisp-course-info) (NAME (PROGRAMMING IN LISP)) > (second (assoc 'name lisp-course-info)) (PROGRAMMING IN LISP)

9 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt9 Simple Database  A database as a list of “records” (setf course-database '( ((course-number CSCI221001) (credit-hours 1) (name (Programming in Lisp)) (instructor (Alok Mehta)) (department (Computer Science))) ((course-number CSCI220001) (credit-hours 1) (name (Programming in C++))) ))  What is the name of the lisp course? (second (assoc 'name (first course-database)))

10 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt10 Access Functions  Write functions to access low-level details (defun get-course-name (course) (second (assoc 'name course))) –Don’t have to remember how data is stored –Can change storage details easily –Access to data is achieved at a higher level –Easier to read and understand –More maintainable code  Write functions to construct and manipulate data (defun make-course (&key course-number credit-hours name instructor department) (list (list 'course-number course-number) (list 'credit-hours credit-hours) (list 'name name) (list 'instructor instructor) (list 'department department) ))

11 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt11 Calling Access Functions > (setf course-1 (make-course :name '(Programming in Java) :instructor '(Alok Mehta))) ((COURSE-NUMBER NIL) (CREDIT-HOURS NIL) (NAME (PROGRAMMING IN JAVA)) (INSTRUCTOR (ALOK MEHTA)) (DEPARTMENT NIL)) > (get-course-name course-1) (PROGRAMMING IN JAVA)

12 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt12 A simple database example (setf courses (list (make-course :course-number 'CSCI220001 :name '(Programming in C++) :instructor '(Louis Ziantz)) (make-course :course-number 'CSCI221001 :name '(Programming in Lisp) :instructor '(Alok Mehta)) (make-course :course-number 'CSCI222001 :name '(Programming in Java) :instructor '(Alok Mehta)) (make-course :course-number 'CSCI223001 :name '(Programming in Perl) :instructor '(Louis Ziantz)) ))

13 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt13 Which courses are offered?  Example Usage > (get-course-numbers courses) (CSCI220001 CSCI221001 CSCI222001 CSCI223001) > (defun get-course-number (course) (second (assoc 'course-number course))) > (defun get-course-numbers (course-list) (if (endp course-list) NIL (cons (get-course-number (first course-list)) (get-course-numbers (rest course-list)))))  Implements a “Transformation” SQL Equivalent: SELECT course_number FROM courses;

14 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt14 Which are taught by Alok?  List the courses taught by Alok Mehta > (get-courses-taught-by-alok courses) (((COURSE-NUMBER CSCI221001) …) ((COURSE-NUMBER CSCI222001)...)...) (defun get-course-instructor (course) (second (assoc 'instructor course))) (defun taught-by-alok-p (course) (if (equal '(Alok Mehta) (get-course-instructor course)) t NIL)) (defun get-courses-taught-by-alok (course-list) (cond ((endp course-list) NIL) ((taught-by-alok-p (first course-list)) (cons (first course-list) (get-courses-taught-by-alok (rest course-list)))) (t (get-courses-taught-by-alok (rest course-list)))))

15 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt15 How many are taught by Alok  List the courses taught by Alok Mehta [Filter] > (get-courses-taught-by-alok courses)  Implements “Filtering” SQL: SELECT * FROM COURSES WHERE instructor = ‘Alok Mehta’;  How many courses are taught by Alok? [Count] > (length (get-courses-taught-by-alok courses)) 2 SQL: SELECT COUNT(*) FROM COURSES WHERE instructor = ‘Alok Mehta’;  What is the first course taught by Alok? [Find] > (first (get-courses-taught-by-alok courses)) ((COURSE-NUMBER CSCI221001) (CREDIT-HOURS NIL) (NAME (PROGRAMMING IN LISP)) (INSTRUCTOR (ALOK MEHTA)) (DEPARTMENT NIL))

16 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt16 More efficient way to Count  A more efficient way to count  Don’t have to get all courses first! (defun count-courses-taught-by-alok (course-list) (cond ((endp course-list) 0) ((taught-by-alok-p (first course-list)) (+ 1 (count-courses-taught-by-alok (rest course-list)))) (t (count-courses-taught-by-alok (rest course-list)))))  A more efficient way to find first course (defun find-first-course-taught-by-alok (course-list) (cond ((endp course-list) nil) ((taught-by-alok-p (first course-list)) (first course-list)) (t (find-first-course-taught-by-alok (rest course-list)))))

17 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt17 Cliches  Many procedures have a common template (defun (input-list) (if (endp input-list) nil (cons ( (first input-list)) ( (rest input-list)))))  Example: –List-transformer: get-course-numbers –Element-transformer: get-course-number (defun get-course-numbers (course-list) (if (endp course-list) NIL (cons (get-course-number (first course-list)) (get-course-numbers (rest course-list)))))  This template is frequently used  Lisp uses the primitive (MAPCAR) to make this easier

18 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt18 Mapcar and Maplist  Mapcar - MAPs a function to successive CARs  Examples > (mapcar #'(lambda (x) (* x 2)) '(1 2 3 4 5)) (2 4 6 8 10) > (mapcar #'= '(1 2 3) '(3 2 1)) (NIL T NIL)  Other MAPxxxx functions  Maplist  Mapc  Mapcan

19 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt19 Mapcar  MAPCAR (mapcar ) Applies to each element of  Example > (mapcar #'oddp '(1 2 3)) (T NIL T) > (mapcar #'get-course-number courses) (CSCI220001 CSCI221001 CSCI222001 CSCI223001) > (mapcar #'= '(1 2 3) '(3 2 1)) (NIL T NIL)

20 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt20 Remove-If, Remove-If-Not  Remove-If, Remove-If-Not > (remove-if-not #'taught-by-alok-p courses) [Removes all courses for which “taught-by-alok-p” returns NIL] This will return all courses taught by Alok > (remove-if #'taught-by-alok-p courses) [Removes all courses for which “taught-by-alok-p” returns non-NIL] This will return all courses NOT taught by Alok  Count-If, Count-If-Not > (count-if #'taught-by-alok-p courses) Counts the number of elements for which “taught-by-alok-p” returns non-NIL  Find-If, Find-If-Not > (find-if #'taught-by-alok-p courses) Returns the FIRST element of courses for which “taught-by-alok-p” returns non- NIL

21 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt21 Lambda  Lambda generates an unnamed function  Example > ((lambda (x) (+ x 100)) 1) 101 –Defines an unnamed function which takes one parameter (x), and has the body (+ x 100) –The function adds 100 to its argument –Invokes the unnamed function with a value of 1 for the paramter –The return value is 1 + 100 = 101  Why use unnamed functions?  Analogy to Java's "anonymous" classes –Don’t have to make up names for procedures –Definition of procedure is close to where it is used

22 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt22 Lambda Procedures  Useful if you need an “anonymous” procedure  Don’t want to give it a name –A named procedure (defun taught-by-alok-p (course) (if (equal '(Alok Mehta) (get-course-instructor course)) t NIL)) –An equivalent un-named procedure (lambda (course) (if (equal '(Alok Mehta) (get-course-instructor course)) t NIL)) –Example usage: How many courses are taught by Alok? (count-if #'(lambda (course) (if (equal '(Alok Mehta) (get-course-instructor course)) t NIL)) courses)

23 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt23 Lambda procedures  Advantage  Don’t have to make up names for procedures  Definition of procedure is close to where it is used (defun get-courses-taught-by-alok (course-list) (remove-if-not #'(lambda (x) (equal '(Alok Mehta) (get-course-instructor x))) course-list))

24 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt24 Data Structures Using Lists  There is no explicit pointer manipulation in Lisp  In Lists, handled automatically via cons cells  Variables are pointers to values –pointer to a cons cell; or –pointer to an atomic value  Lists  Powerful for implementing variety of data structures  Examples of data structures are on next few slides

25 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt25 Linked List DS using Lists  Linked List  Copy-List  Built-in function that takes a list and returns a copy of it > (defun our-copy-list (lst) (if (atom lst) lst (cons (car lst) (our-copy-list (cdr lst))))) ABC X

26 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt26 Stack DS using Lists  Push, Pop macros implement the stack data structure using Lists ABC X

27 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt27 Binary Tree DS Using Lists  Cons cell of List can be used as the left/right branches of a binary tree (a (b c) d) A B C D

28 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt28 N-ary Tree DS Using Lists

29 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt29 Tree Functions  Copy-tree  Built-in function to copy a tree  Similar to Copy-List, except it does a deep recursive copy on the CAR as well as the CDR  Doubly recursive  Example implementation > (defun our-copy-tree (tr) (if (atom tr) tr (cons (our-copy-tree (car tr)) (our-copy-tree (cdr tr)))))  Other built-in tree functions  subst, tree-equal

30 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt30 Set DS Using Lists  Member > (member 'b '(a b c)) (B C) > (member '(a) '((a) (z)) :test #'equal) ((A) (Z)) > (member 'a '((a b) (c d)) :key #'car) ((A B) (C D))  Adjoin - Adds an element to a set [conditional cons] > (adjoin 'b '(a b c)) (A B C) > (adjoin 'z '(a b c)) (Z A B C)  Union, Intersection, Set-Difference > (union '(a b c) '(c b s)) (A C B S) > (intersection '(a b c) (b b c)) (B C) > (set-difference '(a b c d e) '(b e)) (A C D)

31 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt31 Sequences  Sequence - an ordered series of objects > (length '(a b c)) 3 > (subseq '(a b c d e f) 2 5) ; Index of A=0; B=1;... (C D E) ; Note: Returns elements at index X, where 2<=X<5 > (reverse '(a b c)) (C B A) > (sort '(7 4 2 9) #'<) (2 4 7 9) > (sort '(A B C D R S C A E) #'string<) (A A B C C D E R S) > (every #'> '(1 3 5) '(0 2 4)) ;((1>0)&&(3>2)&&(5>4)) T > (some #'= '(1 3 5) '(0 3 5)) ;((1=0)||(3=3)||(5=5)) T

32 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt32 Dotted Lists  A proper list is either NIL or a CONS who's CDR is a proper list  Dotted List  Really a two-part structure  The "CDR" part doesn't point to a list > (setf x (cons 'a 'b)) (A. B) > (setf x '(a. b)) ; Shorthand (A. B)  Don't use dotted lists  Not really needed A X B

33 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt33 Graph DS Using Lists  A Graph consists of vertices and edges  One way to represent a graph ((v1. Neighbors-of-v1) (v2. Neighbors-of-v2) …)  Example > (setf graph-1 '((a b c) (b c) (c d))) ((A B C) (B C) (C D)) A B C D

34 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt34 Specialized Data Structures  We've seen that Lists are extremely versatile  I said that everything in Lisp is an Atom or a List  I lied...  I sort of lied…  depends on what the meaning of Atom is…  There are many types of atoms  More efficient than Lists

35 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt35 Vector  Vector - one dimensional array > (setf x (vector "a" 'b 3)) #("a" B 3) ; The # is a short-hand/notation for array  Vectors are atoms, not lists > (atom x) ; A vector is an Atom T > (listp x) ; A vector is not a List NIL > (length x) ; Length works for lists and vectors 3 > (null (vector)) ; An empty vector #() is not NIL NIL  AREF is used to update/access elements > (aref x 0) ; get the zero'th element of x "a" > (setf (aref x 1) 'c) C > x #("a" C 3)

36 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt36 Example: Binary Search (defun bin-search (obj vec &optional (start 0) (end (- (length vec) 1)) &aux (range (- end start)) (midpt (+ start (round (/ range 2))))) (print (list obj vec start end)) ; Optional, to display (if (> start end) NIL ; We crossed over (let ((obj_at_midpt (aref vec midpt))) (cond ((equal obj obj_at_midpt) obj) ; Found ((< obj obj_at_midpt) ; In lower half (bin-search obj vec start (- midpt 1))) ((> obj obj_at_midpt) ; In upper half (bin-search obj vec (+ midpt 1) end))))))

37 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt37 Multi-Dimensional Arrays  MAKE-ARRAY - Generates arrays  Has keywords :initial-element and :initial-contents > (setf arr (make-array '(2 3))) #2A((NIL NIL NIL) (NIL NIL NIL)) > (setf vec (make-array 4 :initial-element 1)) #(1 1 1 1) ; A Vector is a 1-dimensional array; note keyword parameter above > (setf tic-tac-toe (make-array '(3 3) :initial-contents '((- O O) (- X X) (- X -)))) #2A((- O O) (- X X) (- X -))  Aref used to reference multi-dimensional arrays > (setf (aref tic-tac-toe 0 0) 'O)

38 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt38 Strings and Characters  String - A vector of characters  Character - Denoted using #\ > (setf x "abcde") "abcde" > (aref x 2) #\c > (setf (aref x 2) #\z) #\z > x "abzde"

39 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt39 User Defined Structures  Association lists were used to represent data (setf lisp-course-info '( (course-number CSCI221001) (credit-hours 1) (name (Programming in Lisp)) (instructor (Alok Mehta)) (department (Computer Science))))  A more efficient - but less flexible way:  User Defined Structures > (defstruct course ; The structure name course-number ; The fields of the structure (credit-hours 4) (name (progn (format t "Course Name: ") (read))) instructor department) COURSE Dflt Value = 4 Default Value = Prompt user

40 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt40 Defstruct  Defines a structure with given name and fields  Automatically writes code to define functions  Constructors, type-checking –make-course, course-p, copy-course  Field access/update –course-course-number, course-credit-hours, course-name, course- instructor, course-department  An example of a function that generates functions  There is no equivalent analogy for C/C++, Java, etc.  You can write functions like Defstruct  CLOS - Common Lisp Object System

41 CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt41 Using Course Structure  Examples of using the course defstruct > (setf c2 (make-course :credit-hours 1 :name '(Programming in Lisp))) #S(COURSE :COURSE-NUMBER NIL :CREDIT-HOURS 1 :NAME (PROGRAMMING IN LISP) :INSTRUCTOR NIL :DEPARTMENT NIL) > (setf c1 (make-course)) ; Uses default values Course Name: (Programming in C++) #S(COURSE :COURSE-NUMBER NIL :CREDIT-HOURS 4 :NAME (PROGRAMMING IN C++) :INSTRUCTOR NIL :DEPARTMENT NIL) > (setf (course-instructor c2) '(Alok Mehta)) (ALOK MEHTA)


Download ppt "CSCI 2210 - Programming in Lisp; Instructor: Alok Mehta; 3_structs.ppt1 CSCI 2210: Programming in Lisp Programming Techniques Data Structures More Built-in."

Similar presentations


Ads by Google