Blame


1 665c255d 2023-08-04 jrmu ;; Exercise 3.25. Generalizing one- and two-dimensional tables, show how to implement a table in which values are stored under an arbitrary number of keys and different values may be stored under different numbers of keys. The lookup and insert! procedures should take as input a list of keys used to access the table.
2 665c255d 2023-08-04 jrmu
3 665c255d 2023-08-04 jrmu ;; we could actually keep the procedure as-is, by treating the list of keys as a single key and comparing equality of lists. The downside to this is that there would be no organization based on keys.
4 665c255d 2023-08-04 jrmu
5 665c255d 2023-08-04 jrmu (define (lookup key table)
6 665c255d 2023-08-04 jrmu (let ((record (assoc key (cdr table))))
7 665c255d 2023-08-04 jrmu (if record
8 665c255d 2023-08-04 jrmu (cdr record)
9 665c255d 2023-08-04 jrmu false)))
10 665c255d 2023-08-04 jrmu (define (assoc key records)
11 665c255d 2023-08-04 jrmu (cond ((null? records) false)
12 665c255d 2023-08-04 jrmu ((equal? key (caar records)) (car records))
13 665c255d 2023-08-04 jrmu (else (assoc key (cdr records)))))
14 665c255d 2023-08-04 jrmu
15 665c255d 2023-08-04 jrmu (define (insert! key value table)
16 665c255d 2023-08-04 jrmu (let ((record (assoc key (cdr table))))
17 665c255d 2023-08-04 jrmu (if record
18 665c255d 2023-08-04 jrmu (set-cdr! record value)
19 665c255d 2023-08-04 jrmu (set-cdr! table
20 665c255d 2023-08-04 jrmu (cons (cons key value) (cdr table)))))
21 665c255d 2023-08-04 jrmu 'ok)
22 665c255d 2023-08-04 jrmu
23 665c255d 2023-08-04 jrmu (define (make-table)
24 665c255d 2023-08-04 jrmu (list '*table*))
25 665c255d 2023-08-04 jrmu
26 665c255d 2023-08-04 jrmu (define (test-case actual expected)
27 665c255d 2023-08-04 jrmu (newline)
28 665c255d 2023-08-04 jrmu (display "Actual: ")
29 665c255d 2023-08-04 jrmu (display actual)
30 665c255d 2023-08-04 jrmu (newline)
31 665c255d 2023-08-04 jrmu (display "Expected: ")
32 665c255d 2023-08-04 jrmu (display expected)
33 665c255d 2023-08-04 jrmu (newline))
34 665c255d 2023-08-04 jrmu
35 665c255d 2023-08-04 jrmu (define tbl (make-table))
36 665c255d 2023-08-04 jrmu ;; 2nd number refers to population in millions
37 665c255d 2023-08-04 jrmu (insert! '(usa california los-angeles) 3.88 tbl)
38 665c255d 2023-08-04 jrmu (insert! '(usa new-york new-york) 8.41 tbl)
39 665c255d 2023-08-04 jrmu (insert! '(china beijing) 21.15 tbl)
40 665c255d 2023-08-04 jrmu (insert! '(china shanghai) 24.15 tbl)
41 665c255d 2023-08-04 jrmu (insert! '(pakistan karachi) 23.5 tbl)
42 665c255d 2023-08-04 jrmu (insert! '(hong-kong) 7.22 tbl)
43 665c255d 2023-08-04 jrmu (insert! '(singapore) 5.4 tbl)
44 665c255d 2023-08-04 jrmu (test-case (lookup '(usa california los-angeles) tbl) 3.88)
45 665c255d 2023-08-04 jrmu (test-case (lookup '(china shanghai) tbl) 24.15)
46 665c255d 2023-08-04 jrmu (test-case (lookup '(singapore) tbl) 5.4)
47 665c255d 2023-08-04 jrmu (test-case (lookup '(usa california rowland-heights) tbl) #f)
48 665c255d 2023-08-04 jrmu (test-case (lookup '(usa new-york) tbl) #f)
49 665c255d 2023-08-04 jrmu (test-case (lookup '(usa new-york new-york) tbl) 8.41)
50 665c255d 2023-08-04 jrmu (test-case (lookup '(usa new-york new-york new-york) tbl) #f)
51 665c255d 2023-08-04 jrmu
52 665c255d 2023-08-04 jrmu
53 665c255d 2023-08-04 jrmu
54 665c255d 2023-08-04 jrmu
55 665c255d 2023-08-04 jrmu