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-intermediate-reader.ss" "lang")((modname 17.8.12) (read-case-sensitive #t) (teachpacks ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp") (lib "dir.ss" "teachpack" "htdp") (lib "hangman.ss" "teachpack" "htdp"))) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp") (lib "dir.ss" "teachpack" "htdp") (lib "hangman.ss" "teachpack" "htdp")))))
4 12687dd9 2023-08-04 jrmu ;A list-of-numbers is either
5 12687dd9 2023-08-04 jrmu ;1. empty or
6 12687dd9 2023-08-04 jrmu ;2. (cons n lon)
7 12687dd9 2023-08-04 jrmu ;where n is a number and lon is a list-of-numbers.
8 12687dd9 2023-08-04 jrmu ;
9 12687dd9 2023-08-04 jrmu ;list=?-1 and list=?-2 : list-of-numbers list-of-numbers -> boolean
10 12687dd9 2023-08-04 jrmu ;Given lon1 and lon2, return true if the two lists are equal, false otherwise.
11 12687dd9 2023-08-04 jrmu
12 12687dd9 2023-08-04 jrmu ;(define (list=?-1 lon1 lon2)
13 12687dd9 2023-08-04 jrmu ; (cond
14 12687dd9 2023-08-04 jrmu ; [(and (empty? lon1)
15 12687dd9 2023-08-04 jrmu ; (empty? lon2)) true]
16 12687dd9 2023-08-04 jrmu ; [(and (cons? lon1)
17 12687dd9 2023-08-04 jrmu ; (empty? lon2)) false]
18 12687dd9 2023-08-04 jrmu ; [(and (empty? lon1)
19 12687dd9 2023-08-04 jrmu ; (cons? lon2)) false]
20 12687dd9 2023-08-04 jrmu ; [(and (cons? lon1)
21 12687dd9 2023-08-04 jrmu ; (cons? lon2)) (and (= (first lon1) (first lon2))
22 12687dd9 2023-08-04 jrmu ; (list=?-1 (rest lon1) (rest lon2)))]))
23 12687dd9 2023-08-04 jrmu
24 12687dd9 2023-08-04 jrmu (define (list=?-1 lon1 lon2)
25 12687dd9 2023-08-04 jrmu (cond
26 12687dd9 2023-08-04 jrmu [(and (empty? lon1)
27 12687dd9 2023-08-04 jrmu (empty? lon2)) true]
28 12687dd9 2023-08-04 jrmu [(and (cons? lon1)
29 12687dd9 2023-08-04 jrmu (cons? lon2)) (and (= (first lon1) (first lon2))
30 12687dd9 2023-08-04 jrmu (list=?-1 (rest lon1) (rest lon2)))]
31 12687dd9 2023-08-04 jrmu [else false]))
32 12687dd9 2023-08-04 jrmu
33 12687dd9 2023-08-04 jrmu
34 12687dd9 2023-08-04 jrmu (define (list=?-2 lon1 lon2)
35 12687dd9 2023-08-04 jrmu (cond
36 12687dd9 2023-08-04 jrmu [(empty? lon1) (empty? lon2)]
37 12687dd9 2023-08-04 jrmu [(cons? lon1) (and (cons? lon2)
38 12687dd9 2023-08-04 jrmu (= (first lon1) (first lon2))
39 12687dd9 2023-08-04 jrmu (list=?-2 (rest lon1) (rest lon2)))]))
40 12687dd9 2023-08-04 jrmu
41 12687dd9 2023-08-04 jrmu ;Test
42 12687dd9 2023-08-04 jrmu ;(list=?-2 empty empty)
43 12687dd9 2023-08-04 jrmu ;(list=?-2 empty '(1))
44 12687dd9 2023-08-04 jrmu ;(list=?-2 '(1) empty)
45 12687dd9 2023-08-04 jrmu ;(list=?-2 '(1) '(1))
46 12687dd9 2023-08-04 jrmu ;(list=?-2 '(1) '(1 2))
47 12687dd9 2023-08-04 jrmu
48 12687dd9 2023-08-04 jrmu ;A list-of-symbols is either
49 12687dd9 2023-08-04 jrmu ;1. empty or
50 12687dd9 2023-08-04 jrmu ;2. (cons s los)
51 12687dd9 2023-08-04 jrmu ;where s is a symbol and los is a list-of-symbols.
52 12687dd9 2023-08-04 jrmu ;
53 12687dd9 2023-08-04 jrmu ;sym-list=? : list-of-symbols list-of-symbols -> boolean
54 12687dd9 2023-08-04 jrmu (define (sym-list=? los1 los2)
55 12687dd9 2023-08-04 jrmu (cond
56 12687dd9 2023-08-04 jrmu [(and (empty? los1)
57 12687dd9 2023-08-04 jrmu (empty? los2)) true]
58 12687dd9 2023-08-04 jrmu [(and (cons? los1)
59 12687dd9 2023-08-04 jrmu (cons? los2)) (and (symbol=? (first los1) (first los2))
60 12687dd9 2023-08-04 jrmu (sym-list=? (rest los1) (rest los2)))]
61 12687dd9 2023-08-04 jrmu [else false]))
62 12687dd9 2023-08-04 jrmu
63 12687dd9 2023-08-04 jrmu ;sort-lon : list-of-numbers -> list-of-numbers
64 12687dd9 2023-08-04 jrmu ;Given a-lon, sort lon.
65 12687dd9 2023-08-04 jrmu
66 12687dd9 2023-08-04 jrmu (define (sort-lon a-lon)
67 12687dd9 2023-08-04 jrmu (cond
68 12687dd9 2023-08-04 jrmu [(empty? a-lon) empty]
69 12687dd9 2023-08-04 jrmu [(cons? a-lon) (insert-number (first a-lon) (sort-lon (rest a-lon)))]))
70 12687dd9 2023-08-04 jrmu
71 12687dd9 2023-08-04 jrmu ;insert-number : number list-of-numbers -> list-of-numbers
72 12687dd9 2023-08-04 jrmu ;Given a-number and a-lon (sorted in ascending order), insert a-number in the proper position in lon to return the resulting sorted list-of-numbers.
73 12687dd9 2023-08-04 jrmu
74 12687dd9 2023-08-04 jrmu (define (insert-number a-number a-lon)
75 12687dd9 2023-08-04 jrmu (cond
76 12687dd9 2023-08-04 jrmu [(empty? a-lon) (list a-number)]
77 12687dd9 2023-08-04 jrmu [(< a-number (first a-lon)) (append (list a-number)
78 12687dd9 2023-08-04 jrmu a-lon)]
79 12687dd9 2023-08-04 jrmu [else (append (list (first a-lon))
80 12687dd9 2023-08-04 jrmu (insert-number a-number (rest a-lon)))]))
81 12687dd9 2023-08-04 jrmu
82 12687dd9 2023-08-04 jrmu ;contains-same-numbers : list-of-numbers list-of-numbers -> boolean
83 12687dd9 2023-08-04 jrmu ;Given lon1 and lon2, return true if the two lists have the same numbers, regardless of order.
84 12687dd9 2023-08-04 jrmu
85 12687dd9 2023-08-04 jrmu (define (contains-same-numbers lon1 lon2)
86 12687dd9 2023-08-04 jrmu (list=?-1 (sort-lon lon1) (sort-lon lon2)))
87 12687dd9 2023-08-04 jrmu
88 12687dd9 2023-08-04 jrmu ;Data Definition
89 12687dd9 2023-08-04 jrmu ;
90 12687dd9 2023-08-04 jrmu ;An atom is either
91 12687dd9 2023-08-04 jrmu ;1. a number,
92 12687dd9 2023-08-04 jrmu ;2. a symbol, or
93 12687dd9 2023-08-04 jrmu ;3. a boolean.
94 12687dd9 2023-08-04 jrmu ;
95 12687dd9 2023-08-04 jrmu ;A list-of-atoms is either
96 12687dd9 2023-08-04 jrmu ;1. empty or
97 12687dd9 2023-08-04 jrmu ;2. (cons a loa)
98 12687dd9 2023-08-04 jrmu ;where a is an atom and loa is a list-of-atoms.
99 12687dd9 2023-08-04 jrmu ;
100 12687dd9 2023-08-04 jrmu ;list-equal? : list-of-atoms list-of-atoms -> boolean
101 12687dd9 2023-08-04 jrmu ;Given loa1 and loa2, determine if the two lists are equal (corresponding elements within the list have equivalent atoms).
102 12687dd9 2023-08-04 jrmu
103 12687dd9 2023-08-04 jrmu (define (list-equal? loa1 loa2)
104 12687dd9 2023-08-04 jrmu (cond
105 12687dd9 2023-08-04 jrmu [(and (empty? loa1)
106 12687dd9 2023-08-04 jrmu (empty? loa2)) true]
107 12687dd9 2023-08-04 jrmu [(and (cons? loa1)
108 12687dd9 2023-08-04 jrmu (empty? loa2)) false]
109 12687dd9 2023-08-04 jrmu [(and (empty? loa1)
110 12687dd9 2023-08-04 jrmu (cons? loa2)) false]
111 12687dd9 2023-08-04 jrmu [(and (cons? loa1)
112 12687dd9 2023-08-04 jrmu (cons? loa2)) (and (atoms-equal? (first loa1) (first loa2))
113 12687dd9 2023-08-04 jrmu (list-equal? (rest loa1) (rest loa2)))]))
114 12687dd9 2023-08-04 jrmu
115 12687dd9 2023-08-04 jrmu ;atoms-equal? : atom atom -> boolean
116 12687dd9 2023-08-04 jrmu ;Given atom1 and atom2, determine if the two atoms are equal.
117 12687dd9 2023-08-04 jrmu
118 12687dd9 2023-08-04 jrmu (define (atoms-equal? atom1 atom2)
119 12687dd9 2023-08-04 jrmu (cond
120 12687dd9 2023-08-04 jrmu [(and (number? atom1)
121 12687dd9 2023-08-04 jrmu (number? atom2)) (= atom1 atom2)]
122 12687dd9 2023-08-04 jrmu [(and (boolean? atom1)
123 12687dd9 2023-08-04 jrmu (boolean? atom2)) (boolean=? atom1 atom2)]
124 12687dd9 2023-08-04 jrmu [(and (symbol? atom1)
125 12687dd9 2023-08-04 jrmu (symbol? atom2)) (symbol=? atom1 atom2)]
126 12687dd9 2023-08-04 jrmu [else false]))
127 12687dd9 2023-08-04 jrmu
128 12687dd9 2023-08-04 jrmu ;(define atomic1 (list 5 'hi 'joe true false))
129 12687dd9 2023-08-04 jrmu ;(define atomic2 (list 5 'hi 'joe true false))
130 12687dd9 2023-08-04 jrmu
131 12687dd9 2023-08-04 jrmu ;A web-page (wp) is either
132 12687dd9 2023-08-04 jrmu ;1. empty,
133 12687dd9 2023-08-04 jrmu ;2. (cons s wp), or
134 12687dd9 2023-08-04 jrmu ;3. (cons ewp wp)
135 12687dd9 2023-08-04 jrmu ;where s is a symbol, wp is a web-page (wp), and ewp is a web-page (wp).
136 12687dd9 2023-08-04 jrmu
137 12687dd9 2023-08-04 jrmu ;wp=? : wp wp -> boolean
138 12687dd9 2023-08-04 jrmu ;Given wp1 and wp2, determine if the two web-pages are identical.
139 12687dd9 2023-08-04 jrmu
140 12687dd9 2023-08-04 jrmu (define (wp=? wp1 wp2)
141 12687dd9 2023-08-04 jrmu (cond
142 12687dd9 2023-08-04 jrmu [(empty? wp1) (empty? wp2)]
143 12687dd9 2023-08-04 jrmu [(symbol? (first wp1)) (and (cons? wp2) (symbol? (first wp2))
144 12687dd9 2023-08-04 jrmu (symbol=? (first wp1) (first wp2))
145 12687dd9 2023-08-04 jrmu (wp=? (rest wp1) (rest wp2)))]
146 12687dd9 2023-08-04 jrmu [(list? (first wp1)) (and (cons? wp2) (list? (first wp2))
147 12687dd9 2023-08-04 jrmu (wp=? (first wp1) (first wp2))
148 12687dd9 2023-08-04 jrmu (wp=? (rest wp1) (rest wp2)))]))
149 12687dd9 2023-08-04 jrmu
150 12687dd9 2023-08-04 jrmu ;(define empwp empty)
151 12687dd9 2023-08-04 jrmu ;(define swpwp (cons 'firstPage (cons 'secondPage empty)))
152 12687dd9 2023-08-04 jrmu ;(define ewpwp (cons (cons 'firstPage empty) (cons 'secondPage empty)))
153 12687dd9 2023-08-04 jrmu ;
154 12687dd9 2023-08-04 jrmu ;(wp=? empwp empwp)
155 12687dd9 2023-08-04 jrmu ;(not (wp=? swpwp empwp))
156 12687dd9 2023-08-04 jrmu ;(not (wp=? ewpwp empwp))
157 12687dd9 2023-08-04 jrmu ;(not (wp=? empwp swpwp))
158 12687dd9 2023-08-04 jrmu ;(wp=? swpwp swpwp)
159 12687dd9 2023-08-04 jrmu ;(not (wp=? ewpwp swpwp))
160 12687dd9 2023-08-04 jrmu ;(not (wp=? empwp ewpwp))
161 12687dd9 2023-08-04 jrmu ;(not (wp=? swpwp ewpwp))
162 12687dd9 2023-08-04 jrmu ;(wp=? ewpwp ewpwp)
163 12687dd9 2023-08-04 jrmu
164 12687dd9 2023-08-04 jrmu ;posn=? : posn posn -> boolean
165 12687dd9 2023-08-04 jrmu ;Given posn1 and posn2, determine if they are equal.
166 12687dd9 2023-08-04 jrmu
167 12687dd9 2023-08-04 jrmu (define (posn=? posn1 posn2)
168 12687dd9 2023-08-04 jrmu (and (posn? posn1) (posn? posn2)
169 12687dd9 2023-08-04 jrmu (= (posn-x posn1) (posn-x posn2))
170 12687dd9 2023-08-04 jrmu (= (posn-y posn1) (posn-y posn2))))
171 12687dd9 2023-08-04 jrmu
172 12687dd9 2023-08-04 jrmu (define-struct node (name left right))
173 12687dd9 2023-08-04 jrmu
174 12687dd9 2023-08-04 jrmu ;A binary tree (BT) either
175 12687dd9 2023-08-04 jrmu ;1. empty or
176 12687dd9 2023-08-04 jrmu ;2. (make-node name left right)
177 12687dd9 2023-08-04 jrmu ;(make-node name left right)
178 12687dd9 2023-08-04 jrmu ;where name is a symbol and left, right are binary trees (BT).
179 12687dd9 2023-08-04 jrmu
180 12687dd9 2023-08-04 jrmu ;tree=? : BT BT -> boolean
181 12687dd9 2023-08-04 jrmu (define (tree=? bt1 bt2)
182 12687dd9 2023-08-04 jrmu (cond
183 12687dd9 2023-08-04 jrmu [(empty? bt1) (empty? bt2)]
184 12687dd9 2023-08-04 jrmu [(node? bt1) (and (node? bt2)
185 12687dd9 2023-08-04 jrmu (tree=? (node-left bt1) (node-left bt2))
186 12687dd9 2023-08-04 jrmu (tree=? (node-right bt1) (node-right bt2)))]))
187 12687dd9 2023-08-04 jrmu #|
188 12687dd9 2023-08-04 jrmu Test
189 12687dd9 2023-08-04 jrmu (define five (make-node 'five empty empty))
190 12687dd9 2023-08-04 jrmu (define four (make-node 'four empty empty))
191 12687dd9 2023-08-04 jrmu (define three (make-node 'three empty empty))
192 12687dd9 2023-08-04 jrmu (define two (make-node 'two four five))
193 12687dd9 2023-08-04 jrmu (define one (make-node 'one two three))
194 12687dd9 2023-08-04 jrmu
195 12687dd9 2023-08-04 jrmu (tree=? one one)
196 12687dd9 2023-08-04 jrmu (not (tree=? one two))
197 12687dd9 2023-08-04 jrmu (not (tree=? one three))
198 12687dd9 2023-08-04 jrmu (not (tree=? two four))
199 12687dd9 2023-08-04 jrmu
200 12687dd9 2023-08-04 jrmu |#
201 12687dd9 2023-08-04 jrmu
202 12687dd9 2023-08-04 jrmu ;An Slist is either
203 12687dd9 2023-08-04 jrmu ;1. empty or
204 12687dd9 2023-08-04 jrmu ;2. (cons s sl)
205 12687dd9 2023-08-04 jrmu ;where s is a Sexpr and sl is a Slist.
206 12687dd9 2023-08-04 jrmu ;
207 12687dd9 2023-08-04 jrmu ;An Sexpr is either
208 12687dd9 2023-08-04 jrmu ;1. a number
209 12687dd9 2023-08-04 jrmu ;2. a boolean
210 12687dd9 2023-08-04 jrmu ;3. a symbol
211 12687dd9 2023-08-04 jrmu ;4. a Slist.
212 12687dd9 2023-08-04 jrmu ;
213 12687dd9 2023-08-04 jrmu ;Slist=? Slist Slist -> boolean
214 12687dd9 2023-08-04 jrmu ;Given Slist1 and Slist2, determines if the two Slists are identical.
215 12687dd9 2023-08-04 jrmu
216 12687dd9 2023-08-04 jrmu (define (Slist=? Slist1 Slist2)
217 12687dd9 2023-08-04 jrmu (cond
218 12687dd9 2023-08-04 jrmu [(empty? Slist1) (empty? Slist2)]
219 12687dd9 2023-08-04 jrmu [(cons? Slist1) (and (cons? Slist2)
220 12687dd9 2023-08-04 jrmu (Sexpr=? (first Slist1) (first Slist2))
221 12687dd9 2023-08-04 jrmu (Slist=? (rest Slist1) (rest Slist2)))]))
222 12687dd9 2023-08-04 jrmu
223 12687dd9 2023-08-04 jrmu ;Sexpr=? Sexpr Sexpr -> boolean
224 12687dd9 2023-08-04 jrmu ;Given Sexpr1 and Sexpr2, determines if the two Sexprs are identical.
225 12687dd9 2023-08-04 jrmu
226 12687dd9 2023-08-04 jrmu (define (Sexpr=? Sexpr1 Sexpr2)
227 12687dd9 2023-08-04 jrmu (cond
228 12687dd9 2023-08-04 jrmu [(number? Sexpr1) (and (number? Sexpr2)
229 12687dd9 2023-08-04 jrmu (= Sexpr1 Sexpr2))]
230 12687dd9 2023-08-04 jrmu [(boolean? Sexpr1) (and (boolean? Sexpr2)
231 12687dd9 2023-08-04 jrmu (boolean=? Sexpr1 Sexpr2))]
232 12687dd9 2023-08-04 jrmu [(symbol? Sexpr1) (and (symbol? Sexpr2)
233 12687dd9 2023-08-04 jrmu (symbol=? Sexpr1 Sexpr2))]
234 12687dd9 2023-08-04 jrmu [(cons? Sexpr1) (and (cons? Sexpr2)
235 12687dd9 2023-08-04 jrmu (Slist=? Sexpr1 Sexpr2))]))
236 12687dd9 2023-08-04 jrmu
237 12687dd9 2023-08-04 jrmu ;An Slist is either
238 12687dd9 2023-08-04 jrmu ;1. empty or
239 12687dd9 2023-08-04 jrmu ;2. (cons s sl)
240 12687dd9 2023-08-04 jrmu ;where s is a Sexpr and sl is a Slist.
241 12687dd9 2023-08-04 jrmu ;
242 12687dd9 2023-08-04 jrmu ;An Sexpr is either
243 12687dd9 2023-08-04 jrmu ;1. a number
244 12687dd9 2023-08-04 jrmu ;2. a boolean
245 12687dd9 2023-08-04 jrmu ;3. a symbol
246 12687dd9 2023-08-04 jrmu ;4. a Slist.
247 12687dd9 2023-08-04 jrmu
248 12687dd9 2023-08-04 jrmu ;(define Sexpr6 true)
249 12687dd9 2023-08-04 jrmu ;(define Sexpr5 15)
250 12687dd9 2023-08-04 jrmu ;(define Slist4 (cons Sexpr5 empty))
251 12687dd9 2023-08-04 jrmu ;(define Sexpr2 Slist4)
252 12687dd9 2023-08-04 jrmu ;(define Slist3 (cons Sexpr6 empty))
253 12687dd9 2023-08-04 jrmu ;(define Slist2 (cons Sexpr2 Slist3))
254 12687dd9 2023-08-04 jrmu ;(define Sexpr1 'FirstExpr)
255 12687dd9 2023-08-04 jrmu ;(define Slist1 (cons Sexpr1 Slist2))
256 12687dd9 2023-08-04 jrmu ;
257 12687dd9 2023-08-04 jrmu ;(Slist=? empty empty)
258 12687dd9 2023-08-04 jrmu ;(not (Slist=? empty (cons 15 empty)))
259 12687dd9 2023-08-04 jrmu ;(not (Slist=? (cons 15 empty) empty))
260 12687dd9 2023-08-04 jrmu ;(not (Slist=? (cons true empty) (cons false empty)))
261 12687dd9 2023-08-04 jrmu ;(Slist=? Slist1 Slist1)
262 12687dd9 2023-08-04 jrmu ;(not (Slist=? Slist2 Slist1))
263 12687dd9 2023-08-04 jrmu ;(not (Slist=? Slist4 Slist2))
264 12687dd9 2023-08-04 jrmu
265 12687dd9 2023-08-04 jrmu ;A list-of-data (lod) is either
266 12687dd9 2023-08-04 jrmu ;1. empty or
267 12687dd9 2023-08-04 jrmu ;2. (cons d lod) where d is a Scheme datum and lod is a list-of-data.
268 12687dd9 2023-08-04 jrmu ;
269 12687dd9 2023-08-04 jrmu ;replace-eol-with : list-of-data list-of-data -> list-of-data
270 12687dd9 2023-08-04 jrmu ;Given lod1 and lod2, append lod2 to the end of lod1.
271 12687dd9 2023-08-04 jrmu
272 12687dd9 2023-08-04 jrmu (define (replace-eol-with lod1 lod2)
273 12687dd9 2023-08-04 jrmu (cond
274 12687dd9 2023-08-04 jrmu [(empty? lod1) lod2]
275 12687dd9 2023-08-04 jrmu [(cons? lod1) (cons (first lod1) (replace-eol-with (rest lod1) lod2))]))
276 12687dd9 2023-08-04 jrmu
277 12687dd9 2023-08-04 jrmu ;test-replace-eol-with : list-of-data list-of-data list-of-data -> boolean
278 12687dd9 2023-08-04 jrmu ;Given lod1, lod2, and expected-result, append lod2 to the end of lod1 and see if it matches the expected result.
279 12687dd9 2023-08-04 jrmu
280 12687dd9 2023-08-04 jrmu (define (test-replace-eol-with lod1 lod2 expected-result)
281 12687dd9 2023-08-04 jrmu (equal? (replace-eol-with lod1 lod2) expected-result))
282 12687dd9 2023-08-04 jrmu
283 12687dd9 2023-08-04 jrmu ;(test-replace-eol-with '(Hi My Name Is Joe) '(Nice To Meet You Joe) '(Hi My Name Is Joe Nice To Meet You Joe))
284 12687dd9 2023-08-04 jrmu ;(not (test-replace-eol-with '(Hi My Name Is Joe) '(Nice To Meet You Joe) '(Hi My Name Is Joe Nice To Meet You Joey)))
285 12687dd9 2023-08-04 jrmu
286 12687dd9 2023-08-04 jrmu ;list-pick : list-of-symbols N[>=1] -> symbol
287 12687dd9 2023-08-04 jrmu ;Given a-los and n, find the nth symbol in a-los. The first symbol in a-los has an index of 1.
288 12687dd9 2023-08-04 jrmu
289 12687dd9 2023-08-04 jrmu (define (list-pick a-los n)
290 12687dd9 2023-08-04 jrmu (cond
291 12687dd9 2023-08-04 jrmu [(and (= n 1)
292 12687dd9 2023-08-04 jrmu (empty? a-los)) (error 'list-pick "list too short")]
293 12687dd9 2023-08-04 jrmu [(and (= n 1)
294 12687dd9 2023-08-04 jrmu (cons? a-los)) (first a-los)]
295 12687dd9 2023-08-04 jrmu [(and (> n 1)
296 12687dd9 2023-08-04 jrmu (empty? a-los)) (error 'list-pick "list too short")]
297 12687dd9 2023-08-04 jrmu [(and (> n 1)
298 12687dd9 2023-08-04 jrmu (cons? a-los)) (list-pick (rest a-los) (sub1 n))]))
299 12687dd9 2023-08-04 jrmu
300 12687dd9 2023-08-04 jrmu (define los '(Fred Ted Bill Bob Joe))
301 12687dd9 2023-08-04 jrmu
302 12687dd9 2023-08-04 jrmu ;test-list-pick : list-of-symbols N[>=1] symbol -> boolean
303 12687dd9 2023-08-04 jrmu
304 12687dd9 2023-08-04 jrmu ;Given a-los, n, and expected-result, pick the n-th symbol from a-los using list-pick and see if it matches our expected-result.
305 12687dd9 2023-08-04 jrmu
306 12687dd9 2023-08-04 jrmu (define (test-list-pick a-los n expected-result)
307 12687dd9 2023-08-04 jrmu (equal? expected-result (list-pick a-los n)))
308 12687dd9 2023-08-04 jrmu
309 12687dd9 2023-08-04 jrmu ;(test-list-pick los 3 'Bill)
310 12687dd9 2023-08-04 jrmu ;(not (test-list-pick los 4 'Bill))
311 12687dd9 2023-08-04 jrmu
312 12687dd9 2023-08-04 jrmu test-evaluate
313 12687dd9 2023-08-04 jrmu
314 12687dd9 2023-08-04 jrmu ;A SchemeData (a representation of a Scheme expression) is either
315 12687dd9 2023-08-04 jrmu ;1. a number,
316 12687dd9 2023-08-04 jrmu ;2. a symbol,
317 12687dd9 2023-08-04 jrmu ;3. an operator structure, or
318 12687dd9 2023-08-04 jrmu ;4. a function.
319 12687dd9 2023-08-04 jrmu
320 12687dd9 2023-08-04 jrmu (define-struct add (left right))
321 12687dd9 2023-08-04 jrmu (define-struct sub (left right))
322 12687dd9 2023-08-04 jrmu (define-struct mul (left right))
323 12687dd9 2023-08-04 jrmu (define-struct div (left right))
324 12687dd9 2023-08-04 jrmu
325 12687dd9 2023-08-04 jrmu ;An operator is a structure
326 12687dd9 2023-08-04 jrmu ;(make-operator left right)
327 12687dd9 2023-08-04 jrmu ;where operator is replaced by one of the four operators:
328 12687dd9 2023-08-04 jrmu ;1. add (addition)
329 12687dd9 2023-08-04 jrmu ;2. sub (subtraction)
330 12687dd9 2023-08-04 jrmu ;3. mul (multiplication)
331 12687dd9 2023-08-04 jrmu ;4. div (division)
332 12687dd9 2023-08-04 jrmu ;and left and right are SchemeData.
333 12687dd9 2023-08-04 jrmu ;
334 12687dd9 2023-08-04 jrmu ;An operator structure
335 12687dd9 2023-08-04 jrmu ;(make-operator left right)
336 12687dd9 2023-08-04 jrmu ;represents the expression
337 12687dd9 2023-08-04 jrmu ;(operator left right)
338 12687dd9 2023-08-04 jrmu ;in Scheme.
339 12687dd9 2023-08-04 jrmu
340 12687dd9 2023-08-04 jrmu (define-struct function (name arg))
341 12687dd9 2023-08-04 jrmu
342 12687dd9 2023-08-04 jrmu ;A function is a structure
343 12687dd9 2023-08-04 jrmu ;(make-function name arg)
344 12687dd9 2023-08-04 jrmu ;where name is a symbol and arg is a SchemeData.
345 12687dd9 2023-08-04 jrmu ;
346 12687dd9 2023-08-04 jrmu ;A function structure
347 12687dd9 2023-08-04 jrmu ;(make-function name arg)
348 12687dd9 2023-08-04 jrmu ;represents the expression
349 12687dd9 2023-08-04 jrmu ;(name arg)