1 / 34

Lecture 16: Tables and OOP

Lecture 16: Tables and OOP. Tables -- get and put. *table*. a. 1. 2. 3. 4. b. c. d. One dimentional tables. ( define (lookup key table) (let ((record (assoc key (cdr table)))) (if record (cdr record) false))). One dimentional tables.

keira
Télécharger la présentation

Lecture 16: Tables and OOP

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Lecture 16: Tables and OOP

  2. Tables -- get and put

  3. *table* a 1 2 3 4 b c d One dimentional tables (define (lookup key table) (let ((record (assoc key (cdr table)))) (if record (cdr record) false)))

  4. One dimentional tables (define (lookup key table) (let ((record (assoc key (cdr table)))) (if record (cdr record) false))) (define (assoc key records) (cond ((null? records) false) ((equal? key (caar records)) (car records)) (else (assoc key (cdr records)))))

  5. One dimentional tables (define (insert! key value table) (let ((record (assoc key (cdr table)))) (if record (set-cdr! record value) (set-cdr! table (cons (cons key value) (cdr table))))) 'ok) Example: (insert! ‘e 5 table)

  6. a 1 2 3 4 *table* b c d e 5 One dimentional tables (define (insert! key value table) (let ((record (assoc key (cdr table)))) (if record (set-cdr! record value) (set-cdr! table (cons (cons key value) (cdr table))))) 'ok)

  7. *table* One dimentional tables (define (make-table)(list '*table*))

  8. Florida Two dimentional tables *table* presidents Clinton Bush 88 92 elections NY Gore Bush Bush California

  9. Two dimentional tables (define (lookup key-1 key-2 table) (let ((subtable (assoc key-1 (cdr table)))) (if subtable (let ((record (assoc key-2 (cdr subtable)))) (if record (cdr record) false)) false))) Example: (lookup ‘elections ‘Florida table) ==> Bush

  10. Two dimentional tables (define (insert! key-1 key-2 value table) (let ((subtable (assoc key-1 (cdr table)))) (if subtable (let ((record (assoc key-2 (cdr subtable)))) (if record (set-cdr! record value) (set-cdr! subtable (cons (cons key-2 value) (cdr subtable))))) (set-cdr! table (cons (list key-1 (cons key-2 value)) (cdr table))))) 'ok) Example: (insert! ‘elections ‘California ‘Gore table) ==> okbb

  11. Florida Gore Two dimentional tables *table* presidents Clinton Bush 88 92 elections NY Gore Bush Bush California

  12. Two dimentional tables Example: (insert! ‘singers ‘Madona ‘M table) ==> ok

  13. presidents singers elections Madona M NY Gore Bush Florida Bush Gore California Two dimentional tables *table* Clinton Bush 88 92

  14. Implement get and put (define oper-table (make-table)) (define (put x y v) (insert! x y v oper-table)) (define (get x y) (lookup x y oper-table))

  15. Introduction to Object Oriented Programming

  16. One View of Data • Tagged data: • Some complex structure constructed from cons cells • Explicit tags to keep track of data types • Implement a data abstraction as set of procedures that operate on the data • "Generic" operations by looking at types: • (define (real-part z) • (cond ((rectangular? z) • (real-part-rectangular (contents z))) • ((polar? z) • (real-part-polar (contents z))) • (else (error "Unknown type -- REAL-PART" z))))

  17. An Alternative View of Data: Procedures with State • A procedure has • parameters and body as specified by l expression • environment (which can hold name-value bindings!) • Can use procedure to encapsulate (and hide) data, and provide controlled access to that data • constructor, accessors, mutators, predicates, operations • mutation: changes in the private state of the procedure

  18. Example: Pair as a Procedure with State (define (cons x y) (lambda (msg) (cond ((eq? msg ‘CAR) x) ((eq? msg ‘CDR) y) ((eq? msg ‘PAIR?) #t) (else (error "pair cannot" msg))))) (define (car p) (p ‘CAR)) (define (cdr p) (p ‘CDR)) (define (pair? p) (and (procedure? p) (p ‘PAIR?)))

  19. (car foo) becomes (foo 'CAR) 2 1 3 3 1 2 GE foo: cons: E1 (car foo) | GE=> (foo 'CAR) | E2=> p: x ybody: (l (msg) (cond ..)) x: 1y: 2 E3 msg: CAR p: msgbody: (cond ...) (cond ...) | E3=> x | E3=> 1 Example: What is our "pair" object? (define foo (cons 1 2))

  20. Pair Mutation as Change in State (define (cons x y) (lambda (msg) (cond ((eq? msg ‘CAR) x) ((eq? msg ‘CDR) y) ((eq? msg ‘PAIR?) #t) ((eq? msg ‘SET-CAR!) (lambda (new-car) (set! x new-car))) ((eq? msg ‘SET-CDR!) (lambda (new-cdr) (set! y new-cdr))) (else (error "pair cannot" msg))))) (define (set-car! p new-car) ((p ‘SET-CAR!) new-car)) (define (set-cdr! p new-cdr) ((p ‘SET-CDR!) new-cdr))

  21. (set-car! bar 0) (set-car! bar 0) | GE=> ((bar 'SET-CAR!) 0) | E5 1 2 3 1 5 4 GE bar: changes x value to 0 in E4 6 E4 0 new-car: 0 x: 3y: 4 (set! x new-car) | E7 E6 msg: SET-CAR! p: msgbody: (cond ...) E7 (cond ...) | E6=> (l (new-car) (set! x new-car)) | E6 p: new-carbody: (set! x new-car) Example: Mutating a pair object (define bar (cons 3 4))

  22. Message Passing Style - Refinements • lexical scoping for private stateandprivate procedures (define (cons x y) (define (change-car new-car) (set! x new-car)) (define (change-cdr new-cdr) (set! y new-cdr)) (lambda (msg . args) (cond ((eq? msg ‘CAR) x) ((eq? msg ‘CDR) y) ((eq? msg ‘PAIR?) #t) ((eq? msg ‘SET-CAR!) (change-car (car args))) ((eq? msg ‘SET-CDR!) (change-cdr (car args))) (else (error "pair cannot" msg))))) (define (car p) (p 'CAR)) (define (set-car! p val) (p 'SET-CAR! val))

  23. Message Passing Style - Refinements • lexical scoping for private stateandprivate procedures (define (cons x y) (define (change-car new-car) (set! x new-car)) (define (change-cdr new-cdr) (set! y new-cdr)) (lambda (msg . args) (cond ((eq? msg ‘CAR) x) ((eq? msg ‘CDR) y) ((eq? msg ‘PAIR?) #t) ((eq? msg ‘SET-CAR!) (change-car (car args))) ((eq? msg ‘SET-CDR!) (change-cdr (car args))) (else (error "pair cannot" msg))))) (define (car p) (p 'CAR)) (define (set-car! p val) (p 'SET-CAR! val))

  24. Programming Styles – Procedural vs. Object-Oriented • Procedural programming: • Organize system around procedures that operate on data (do-something <data> <arg> ...) (do-another-thing <data>) • Object-based programming: • Organize system around objects that receive messages • (<object> 'do-something <arg>) • (<object> 'do-another-thing) • An object encapsulates data and operations • Message passing and procedure are the means to write Object • Oriented code in scheme

  25. Tables in OO style (define (make-table) (let ((local-table (list '*table*))) (define (lookup key-1 key-2) . . . ) (define (insert! key-1 key-2 value) . . . 'ok) (define (dispatch m) (cond ((eq? m 'lookup-proc) lookup) ((eq? m 'insert-proc!) insert!) (else (error "Unknown operation -- TABLE" m)))) dispatch))

  26. Table in OO style (define operation-table (make-table)) (define get (operation-table 'lookup-proc)) (define put (operation-table 'insert-proc!))

  27. oper-table: local-table lookup: insert!: E1 dispatch: p: key-1 key-2b: . . . *table* (define oper-table (make-table)) | GE make-table: GE p: b: (let ((local-table (list '*table*))) . . . )

  28. Object-Oriented Programming Terminology • Class: • specifies the common behavior of entities • in scheme, a "maker" procedure • E.g. cons or make-table in our previous examples • Instance: • A particular object or entity of a given class • in scheme, an instance is a message-handling procedure made by the maker procedure • E.g. foo or bar or oper-table in our previous examples

  29. Stacks in OO style (define (make-stack) (let ((top-ptr '())) (define (empty?) (null? top-ptr)) (define (delete!) (if (null? top-ptr) (error . . .) (set! top-ptr (cdr top-ptr))) top-ptr ) (define (insert! elmt) (set! top-ptr (cons elmt top-ptr)) top-ptr) (define (top) (if (null? top-ptr) (error . . .) (car top-ptr))) (define (dispatch op) (cond ((eq? op 'empty?) empty?) ((eq? op 'top) top) ((eq? op 'insert!) insert!) ((eq? op 'delete!) delete!))) dispatch))

  30. Stacks in OO style undef (define s (make-stack)) ==> ((s 'insert!) 'a) ==> ((s 'insert!) 'b) ==> ((s 'top)) ==> ((s 'delete!)) ==> ((s 'top)) ==> ((s 'delete!)) ==> (a) (b a) b (a) a ()

  31. Queues in OO style A lazy approach: We know how to do stacks so lets do queues with stacks :) We need two stacks: stack1 stack2 insert delete

  32. a a b a b b c b c Queues in OO style ((q ‘insert) ‘a) ((q ‘insert) ‘b) ((q ‘delete)) ((q ‘insert) ‘c) ((q ‘delete))

  33. Queues in OO style (define (make-queue) (let ((stack1 (make-stack)) (stack2 (make-stack))) (define (reverse-stack s1 s2) _______________) (define (empty?) (and ((stack1 'empty?)) ((stack2 'empty?)))) (define (delete!) (if ((stack2 'empty?)) (reverse-stack stack1 stack2)) (if ((stack2 'empty?)) (error . . .) ((stack2 'delete!)))) (define (first) (if ((stack2 'empty?)) (reverse-stack stack1 stack2)) (if ((stack2 'empty?)) (error . . .) ((stack2 'top)))) (define (dispatch op) (cond ((eq? op 'empty?) empty?) ((eq? op 'first) first) ((eq? op 'delete!) delete!) (else (stack1 op)))) dispatch))

  34. Queues in OO style Inheritance: One class is a refinement of another The queue class is a subclass of the stack class

More Related