/
ex3.25.scm
60 lines (48 loc) · 1.72 KB
/
ex3.25.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
(define (make-table)
(define (assoc key records)
(cond ((null? records) false)
((equal? key (caar records)) (car records))
(else (assoc key (cdr records)))))
(define (lookup-recursive table-or-record keys)
(if (null? keys)
(cdr table-or-record)
(let ((subtable (assoc (car keys) (cdr table-or-record))))
(if subtable
(lookup-recursive subtable (cdr keys))
false))))
(define (insert-recursive! table-or-record keys value)
(cond ((null? keys)
(set-cdr! table-or-record value)
'ok)
(else
(let ((subtable (assoc (car keys) (cdr table-or-record))))
(if subtable
(insert-recursive! subtable (cdr keys) value)
(let ((new-subtable (cons (car keys) '())))
(set-cdr! table-or-record
(cons new-subtable
(cdr table-or-record)))
(insert-recursive! new-subtable (cdr keys) value)))))))
(let ((local-table (list '*table*)))
(define (lookup keys)
(lookup-recursive local-table keys))
(define (insert! keys value)
(insert-recursive! local-table keys value))
(define (print) (display local-table))
(define (dispatch m)
(cond ((eq? m 'lookup-proc) lookup)
((eq? m 'insert-proc!) insert!)
((eq? m 'print-proc) print)
(else (error "Unknown operation -- TABLE" m))))
dispatch))
(define tab (make-table))
(define get (tab 'lookup-proc))
(define put (tab 'insert-proc!))
(define print (tab 'print-proc))
(put '(a b c d) 5)
(print)
(get '(a b c d))
(put '(a f g h) 10)
(get '(a f g h))
(put '(* +) 100)
(get '(* +))