Blame


1 12687dd9 2023-08-04 jrmu ;; The first three lines of this file were inserted by DrScheme. They record metadata
2 12687dd9 2023-08-04 jrmu ;; about the language level of this file in a form that our tools can easily process.
3 12687dd9 2023-08-04 jrmu #reader(lib "htdp-advanced-reader.ss" "lang")((modname 39.1.6) (read-case-sensitive #t) (teachpacks ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp") (lib "gui.ss" "teachpack" "htdp"))) (htdp-settings #(#t constructor repeating-decimal #t #t none #f ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp") (lib "gui.ss" "teachpack" "htdp")))))
4 12687dd9 2023-08-04 jrmu ;;Model
5 12687dd9 2023-08-04 jrmu
6 12687dd9 2023-08-04 jrmu ;;State Variable
7 12687dd9 2023-08-04 jrmu ;;address-book : (listof (list symbol number))
8 12687dd9 2023-08-04 jrmu ;;Stores a list of list of two items (pairs) of names and numbers representing entries in an address book.
9 12687dd9 2023-08-04 jrmu (define address-book empty)
10 12687dd9 2023-08-04 jrmu
11 12687dd9 2023-08-04 jrmu ;add-to-address-book : symbol number -> void
12 12687dd9 2023-08-04 jrmu ;Effect: Adds name and phone to the address-book. Produces no output.
13 12687dd9 2023-08-04 jrmu
14 12687dd9 2023-08-04 jrmu (define (add-to-address-book name phone)
15 12687dd9 2023-08-04 jrmu (set! address-book (cons (list name phone) address-book)))
16 12687dd9 2023-08-04 jrmu
17 12687dd9 2023-08-04 jrmu ;remove : symbol -> void
18 12687dd9 2023-08-04 jrmu ;Effect: Removes name from address-book. No output returned.
19 12687dd9 2023-08-04 jrmu (define (remove name)
20 12687dd9 2023-08-04 jrmu (local ((define (remove-aux aname abook)
21 12687dd9 2023-08-04 jrmu (cond
22 12687dd9 2023-08-04 jrmu [(empty? abook) empty]
23 12687dd9 2023-08-04 jrmu [(symbol=? (first (first abook)) aname) (remove-aux aname (rest abook))]
24 12687dd9 2023-08-04 jrmu [else (cons (first abook)
25 12687dd9 2023-08-04 jrmu (remove-aux aname (rest abook)))])))
26 12687dd9 2023-08-04 jrmu (set! address-book (remove-aux name address-book))))
27 12687dd9 2023-08-04 jrmu
28 12687dd9 2023-08-04 jrmu
29 12687dd9 2023-08-04 jrmu
30 12687dd9 2023-08-04 jrmu ;lookup-name : symbol (listof (list symbol number)) -> number or false
31 12687dd9 2023-08-04 jrmu ;Output: Lookup the phone number for aname in abook. No effect (memory neither changed nor accessed).
32 12687dd9 2023-08-04 jrmu
33 12687dd9 2023-08-04 jrmu (define (lookup-name aname abook)
34 12687dd9 2023-08-04 jrmu (lookup-abstract aname abook first second))
35 12687dd9 2023-08-04 jrmu
36 12687dd9 2023-08-04 jrmu ;lookup-number : number (listof (list symbol number)) -> symbol or false
37 12687dd9 2023-08-04 jrmu ;Output: Lookup the name for the entry with anumber in abook. No effect (memory neither changed nor accessed).
38 12687dd9 2023-08-04 jrmu
39 12687dd9 2023-08-04 jrmu (define (lookup-number anumber abook)
40 12687dd9 2023-08-04 jrmu (lookup-abstract anumber abook second first))
41 12687dd9 2023-08-04 jrmu
42 12687dd9 2023-08-04 jrmu ;lookup-abstract : X (listof (list symbol number)) ((listof Z) -> Z) ((listof Z) -> Z) -> Y
43 12687dd9 2023-08-04 jrmu ;Output: Given anx, abook, op1, and op2, returns a number given a symbol or a symbol given a number. X and Y are different data types.
44 12687dd9 2023-08-04 jrmu ;No effect.
45 12687dd9 2023-08-04 jrmu
46 12687dd9 2023-08-04 jrmu (define (lookup-abstract anx abook op1 op2)
47 12687dd9 2023-08-04 jrmu (cond
48 12687dd9 2023-08-04 jrmu [(empty? abook) false]
49 12687dd9 2023-08-04 jrmu [(equal? (op1 (first abook)) anx) (op2 (first abook))]
50 12687dd9 2023-08-04 jrmu [else (lookup-abstract anx (rest abook) op1 op2)]))
51 12687dd9 2023-08-04 jrmu
52 12687dd9 2023-08-04 jrmu ;;View
53 12687dd9 2023-08-04 jrmu
54 12687dd9 2023-08-04 jrmu (define name-text (make-text "Name"))
55 12687dd9 2023-08-04 jrmu (define number-text (make-text "Number"))
56 12687dd9 2023-08-04 jrmu (define results-message (make-message "Delta Notch Phone Beta"))
57 12687dd9 2023-08-04 jrmu
58 12687dd9 2023-08-04 jrmu
59 12687dd9 2023-08-04 jrmu ;;Controller
60 12687dd9 2023-08-04 jrmu
61 12687dd9 2023-08-04 jrmu ;add-entry-callback : event -> true
62 12687dd9 2023-08-04 jrmu ;Effect: Adds the contents of name-text and number-text into the beginning of address-book.
63 12687dd9 2023-08-04 jrmu (define (add-entry-callback event)
64 12687dd9 2023-08-04 jrmu (void? (add-to-address-book (string->symbol (text-contents name-text)) (string->number (text-contents number-text)))))
65 12687dd9 2023-08-04 jrmu
66 12687dd9 2023-08-04 jrmu ;remove-name-callback : event -> true
67 12687dd9 2023-08-04 jrmu ;Effect: Removes an entry from address-book associated with the text contents of name-text.
68 12687dd9 2023-08-04 jrmu (define (remove-name-callback event)
69 12687dd9 2023-08-04 jrmu (void? (remove (string->symbol (text-contents name-text)))))
70 12687dd9 2023-08-04 jrmu
71 12687dd9 2023-08-04 jrmu ;search-callback : event -> true
72 12687dd9 2023-08-04 jrmu (define (search-callback event)
73 12687dd9 2023-08-04 jrmu (local
74 12687dd9 2023-08-04 jrmu ((define found-name
75 12687dd9 2023-08-04 jrmu (lookup-number (string->number (text-contents number-text)) address-book))
76 12687dd9 2023-08-04 jrmu (define found-number
77 12687dd9 2023-08-04 jrmu (lookup-name (string->symbol (text-contents name-text)) address-book)))
78 12687dd9 2023-08-04 jrmu (cond
79 12687dd9 2023-08-04 jrmu [(and (equal? (text-contents name-text) "")
80 12687dd9 2023-08-04 jrmu (symbol? found-name))
81 12687dd9 2023-08-04 jrmu (draw-message results-message (symbol->string found-name))]
82 12687dd9 2023-08-04 jrmu [(number? found-number)
83 12687dd9 2023-08-04 jrmu (draw-message results-message (number->string found-number))]
84 12687dd9 2023-08-04 jrmu [else (draw-message results-message "Entry not found")])))
85 12687dd9 2023-08-04 jrmu
86 12687dd9 2023-08-04 jrmu
87 12687dd9 2023-08-04 jrmu
88 12687dd9 2023-08-04 jrmu (create-window (list (list name-text (make-button "Add entry" add-entry-callback))
89 12687dd9 2023-08-04 jrmu (list number-text (make-button "Search!" search-callback))
90 12687dd9 2023-08-04 jrmu (list results-message (make-button "Remove name" remove-name-callback))))
91 12687dd9 2023-08-04 jrmu
92 12687dd9 2023-08-04 jrmu ;Tests
93 12687dd9 2023-08-04 jrmu (define (init-address-book)
94 12687dd9 2023-08-04 jrmu (begin (add-to-address-book 'Aaron 525)
95 12687dd9 2023-08-04 jrmu (add-to-address-book 'Geffen 3225)
96 12687dd9 2023-08-04 jrmu (add-to-address-book 'Jobs 5251)
97 12687dd9 2023-08-04 jrmu (add-to-address-book 'Gates 5265)
98 12687dd9 2023-08-04 jrmu (add-to-address-book 'Dell 5259)
99 12687dd9 2023-08-04 jrmu (remove 'Aaron)
100 12687dd9 2023-08-04 jrmu address-book))
101 12687dd9 2023-08-04 jrmu (init-address-book)