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 ;;make-address-book : string -> address-book
5 12687dd9 2023-08-04 jrmu ;;
6 12687dd9 2023-08-04 jrmu ;;An address-book is an interface
7 12687dd9 2023-08-04 jrmu ;;1. 'add :: symbol number -> void
8 12687dd9 2023-08-04 jrmu ;;2. 'remove :: symbol -> void
9 12687dd9 2023-08-04 jrmu ;;3. 'lookup-name :: symbol -> number or false
10 12687dd9 2023-08-04 jrmu ;;4. 'lookup-number :: number -> symbol or false
11 12687dd9 2023-08-04 jrmu
12 12687dd9 2023-08-04 jrmu (define-struct entry (name number))
13 12687dd9 2023-08-04 jrmu
14 12687dd9 2023-08-04 jrmu ;;An entry is a structure
15 12687dd9 2023-08-04 jrmu ;;(make-entry na nu)
16 12687dd9 2023-08-04 jrmu ;;where na is a symbol, nu is a number.
17 12687dd9 2023-08-04 jrmu
18 12687dd9 2023-08-04 jrmu (define (make-address-book title)
19 12687dd9 2023-08-04 jrmu (local (;;Model
20 12687dd9 2023-08-04 jrmu
21 12687dd9 2023-08-04 jrmu ;;State Variable
22 12687dd9 2023-08-04 jrmu ;;address-book : (listof entry)
23 12687dd9 2023-08-04 jrmu ;;Represents the entries in a physical address book
24 12687dd9 2023-08-04 jrmu (define address-book empty)
25 12687dd9 2023-08-04 jrmu
26 12687dd9 2023-08-04 jrmu ;;add-to-address-book : symbol number -> void
27 12687dd9 2023-08-04 jrmu ;;Effect: Adds name and phone to the address-book. Produces no output.
28 12687dd9 2023-08-04 jrmu (define (add-to-address-book name phone)
29 12687dd9 2023-08-04 jrmu (set! address-book (cons (make-entry name phone) address-book)))
30 12687dd9 2023-08-04 jrmu
31 12687dd9 2023-08-04 jrmu ;;remove : symbol -> void
32 12687dd9 2023-08-04 jrmu ;;Effect: Removes name from address-book. No output returned.
33 12687dd9 2023-08-04 jrmu (define (remove name)
34 12687dd9 2023-08-04 jrmu (set! address-book
35 12687dd9 2023-08-04 jrmu (filter (lambda (anentry) (not (equal? name (entry-name anentry))))
36 12687dd9 2023-08-04 jrmu address-book)))
37 12687dd9 2023-08-04 jrmu
38 12687dd9 2023-08-04 jrmu ;;lookup-name : symbol (listof (list symbol number)) -> number or false
39 12687dd9 2023-08-04 jrmu ;;Output: Lookup the phone number for aname in abook.
40 12687dd9 2023-08-04 jrmu ;;No effect (memory neither changed nor accessed).
41 12687dd9 2023-08-04 jrmu (define (lookup-name aname abook)
42 12687dd9 2023-08-04 jrmu (lookup-abstract aname abook entry-name entry-number))
43 12687dd9 2023-08-04 jrmu
44 12687dd9 2023-08-04 jrmu ;;lookup-number : number (listof (list symbol number)) -> symbol or false
45 12687dd9 2023-08-04 jrmu ;;Output: Lookup the name for the entry with anumber in abook.
46 12687dd9 2023-08-04 jrmu ;;No effect (memory neither changed nor accessed).
47 12687dd9 2023-08-04 jrmu (define (lookup-number anumber abook)
48 12687dd9 2023-08-04 jrmu (lookup-abstract anumber abook entry-number entry-name))
49 12687dd9 2023-08-04 jrmu
50 12687dd9 2023-08-04 jrmu ;;lookup-abstract :
51 12687dd9 2023-08-04 jrmu ;;X (listof (list symbol number)) ((listof Z) -> Z) ((listof Z) -> Z) -> Y
52 12687dd9 2023-08-04 jrmu ;;Output: Given anx, abook, op1, and op2, returns a number
53 12687dd9 2023-08-04 jrmu ;;given a symbol or a symbol given a number. X and Y are different data types.
54 12687dd9 2023-08-04 jrmu ;;No effect.
55 12687dd9 2023-08-04 jrmu
56 12687dd9 2023-08-04 jrmu (define (lookup-abstract anx abook op1 op2)
57 12687dd9 2023-08-04 jrmu (cond
58 12687dd9 2023-08-04 jrmu [(empty? abook) false]
59 12687dd9 2023-08-04 jrmu [(equal? (op1 (first abook)) anx) (op2 (first abook))]
60 12687dd9 2023-08-04 jrmu [else (lookup-abstract anx (rest abook) op1 op2)]))
61 12687dd9 2023-08-04 jrmu
62 12687dd9 2023-08-04 jrmu (define (service-manager msg)
63 12687dd9 2023-08-04 jrmu (cond
64 12687dd9 2023-08-04 jrmu [(symbol=? msg 'add) add-to-address-book]
65 12687dd9 2023-08-04 jrmu [(symbol=? msg 'remove) remove]
66 12687dd9 2023-08-04 jrmu [(symbol=? msg 'lookup-name)
67 12687dd9 2023-08-04 jrmu (lambda (aname) (lookup-name aname address-book))]
68 12687dd9 2023-08-04 jrmu [(symbol=? msg 'lookup-number)
69 12687dd9 2023-08-04 jrmu (lambda (anumber) (lookup-number anumber address-book))])))
70 12687dd9 2023-08-04 jrmu service-manager))
71 12687dd9 2023-08-04 jrmu
72 12687dd9 2023-08-04 jrmu
73 12687dd9 2023-08-04 jrmu ;;gui-for-address-book : (listof strings) -> true
74 12687dd9 2023-08-04 jrmu ;;Consumes alos. Outputs true.
75 12687dd9 2023-08-04 jrmu ;;Effects:
76 12687dd9 2023-08-04 jrmu ;;1. Creates a new address book (define a new interface for each string?) for each one.
77 12687dd9 2023-08-04 jrmu ;;2. Creates a GUI for the address books.
78 12687dd9 2023-08-04 jrmu
79 12687dd9 2023-08-04 jrmu (define (gui-for-address-book alos)
80 12687dd9 2023-08-04 jrmu (local (;;View
81 12687dd9 2023-08-04 jrmu (define book-list
82 12687dd9 2023-08-04 jrmu (build-list (length alos)
83 12687dd9 2023-08-04 jrmu (lambda (i) (make-address-book (list-ref alos i)))))
84 12687dd9 2023-08-04 jrmu (define greeting-msg (make-message "Delta Notch - People Finder Pro Deluxe (TM)"))
85 12687dd9 2023-08-04 jrmu (define book-msg (make-message "Select address book: "))
86 12687dd9 2023-08-04 jrmu (define book-choice (make-choice alos))
87 12687dd9 2023-08-04 jrmu (define input-name (make-text "Name: "))
88 12687dd9 2023-08-04 jrmu (define input-number (make-text "Number: "))
89 12687dd9 2023-08-04 jrmu (define results-msg (make-message ""))
90 12687dd9 2023-08-04 jrmu
91 12687dd9 2023-08-04 jrmu ;;Controller
92 12687dd9 2023-08-04 jrmu (define (add-callback event)
93 12687dd9 2023-08-04 jrmu (local ((define address-book-interface
94 12687dd9 2023-08-04 jrmu (list-ref book-list (choice-index book-choice)))
95 12687dd9 2023-08-04 jrmu (define aname-sym (string->symbol (text-contents input-name)))
96 12687dd9 2023-08-04 jrmu (define anumber-num (string->number (text-contents input-number))))
97 12687dd9 2023-08-04 jrmu (begin ((address-book-interface 'add) aname-sym anumber-num)
98 12687dd9 2023-08-04 jrmu (draw-message results-msg
99 12687dd9 2023-08-04 jrmu (string-append "Added: "
100 12687dd9 2023-08-04 jrmu (symbol->string aname-sym)
101 12687dd9 2023-08-04 jrmu " "
102 12687dd9 2023-08-04 jrmu (number->string anumber-num))))))
103 12687dd9 2023-08-04 jrmu (define (remove-callback event)
104 12687dd9 2023-08-04 jrmu (local ((define address-book-interface
105 12687dd9 2023-08-04 jrmu (list-ref book-list (choice-index book-choice)))
106 12687dd9 2023-08-04 jrmu (define aname-sym (string->symbol (text-contents input-name)))
107 12687dd9 2023-08-04 jrmu (define anumber-num (string->number (text-contents input-number))))
108 12687dd9 2023-08-04 jrmu (begin ((address-book-interface 'remove) aname-sym)
109 12687dd9 2023-08-04 jrmu (draw-message results-msg
110 12687dd9 2023-08-04 jrmu (string-append "Removed: "
111 12687dd9 2023-08-04 jrmu (symbol->string aname-sym)
112 12687dd9 2023-08-04 jrmu " "
113 12687dd9 2023-08-04 jrmu (number->string anumber-num))))))
114 12687dd9 2023-08-04 jrmu (define (lookup-callback event)
115 12687dd9 2023-08-04 jrmu (local ((define address-book-interface
116 12687dd9 2023-08-04 jrmu (list-ref book-list (choice-index book-choice)))
117 12687dd9 2023-08-04 jrmu (define aname (text-contents input-name))
118 12687dd9 2023-08-04 jrmu (define anumber (text-contents input-number))
119 12687dd9 2023-08-04 jrmu (define aname-sym (string->symbol aname))
120 12687dd9 2023-08-04 jrmu (define anumber-num (string->number anumber))
121 12687dd9 2023-08-04 jrmu (define return-name
122 12687dd9 2023-08-04 jrmu ((address-book-interface 'lookup-number) anumber-num))
123 12687dd9 2023-08-04 jrmu (define return-number
124 12687dd9 2023-08-04 jrmu ((address-book-interface 'lookup-name) aname-sym)))
125 12687dd9 2023-08-04 jrmu (cond
126 12687dd9 2023-08-04 jrmu [(and (not (equal? aname ""))
127 12687dd9 2023-08-04 jrmu (number? return-number))
128 12687dd9 2023-08-04 jrmu (draw-message results-msg (number->string return-number))]
129 12687dd9 2023-08-04 jrmu [(and (not (equal? anumber ""))
130 12687dd9 2023-08-04 jrmu (symbol? return-name))
131 12687dd9 2023-08-04 jrmu (draw-message results-msg (symbol->string return-name))]
132 12687dd9 2023-08-04 jrmu [(and (not (equal? aname ""))
133 12687dd9 2023-08-04 jrmu (boolean? return-name))
134 12687dd9 2023-08-04 jrmu (draw-message results-msg "Name not found")]
135 12687dd9 2023-08-04 jrmu [(and (not (equal? anumber ""))
136 12687dd9 2023-08-04 jrmu (boolean? return-number))
137 12687dd9 2023-08-04 jrmu (draw-message results-msg "Number not found")]
138 12687dd9 2023-08-04 jrmu [else (draw-message results-msg "Please enter a name or number")])))
139 12687dd9 2023-08-04 jrmu (define add-button (make-button "Add Entry" add-callback))
140 12687dd9 2023-08-04 jrmu (define remove-button (make-button "Remove Entry" remove-callback))
141 12687dd9 2023-08-04 jrmu (define lookup-button (make-button "Lookup" lookup-callback)))
142 12687dd9 2023-08-04 jrmu (create-window (list (list greeting-msg)
143 12687dd9 2023-08-04 jrmu (list book-msg book-choice)
144 12687dd9 2023-08-04 jrmu (list input-name add-button)
145 12687dd9 2023-08-04 jrmu (list input-number remove-button)
146 12687dd9 2023-08-04 jrmu (list results-msg lookup-button)))))
147 12687dd9 2023-08-04 jrmu
148 12687dd9 2023-08-04 jrmu
149 12687dd9 2023-08-04 jrmu
150 12687dd9 2023-08-04 jrmu (gui-for-address-book '("Hsinya's Book" "Aaron's Book" "Anonymous Book"))