Blob


1 (define (make-table)
2 (define local-table '())
3 (define make-record cons)
4 (define key-record car)
5 (define value-record cdr)
6 (define (make-tree entry left right)
7 (list entry let right))
8 (define entry car)
9 (define left-branch cadr)
10 (define right-branch caddr)
11 (define key=? equal?)
12 (define (list<? l1 l2)
13 (andmap key<? l1 l2))
14 (define (key<? key1 key2)
15 (cond ((and (string? key1)
16 (string? key2)) (string<? key1 key2))
17 ((and (number? key1)
18 (number? key2)) (< key1 key2))
19 ((and (char? key1)
20 (char? key2)) (char<? key1 key2))
21 (else (error "Unsupported key types -- KEY<?" key1 key2))))
22 (define (element-of-set? x set)
23 (cond ((null? set) false)
24 ((key=? (key-record x) (key-record (entry set))) true)
25 ((key<? (key-record x) (key-record (entry set)))
26 (element-of-set? x (left-branch set)))
27 (else
28 (element-of-set? x (right-branch set)))))
29 (define (adjoin-set x set)
30 (cond ((null? set) (make-tree x '() '()))
31 ((key=? (key-record x) (key-record (entry set))) set)
32 ((key<? (key-record x) (key-record (entry set)))
33 (make-tree (entry set)
34 (adjoin-set x (left-branch set))
35 (right-branch set)))
36 (else
37 (make-tree (entry set)
38 (left-branch set)
39 (adjoin-set x (right-branch set))))))
40 (define (lookup key records)
41 (if (null? records)
42 false
43 (let* ((record (entry records))
44 (key-entry (key-record record)))
45 (cond ((key=? key key-entry) (value-record record))
46 ((key<? key key-entry) (lookup key (left-branch records)))
47 (else (lookup key (right-branch records)))))))
48 (define (insert! key value)
49 (set! local-table
50 (adjoin-set (cons key value)
51 local-table)))
52 (define (dispatch m)
53 (cond ((eq? m 'lookup)
54 (lambda (key)
55 (lookup key local-table)))
56 ((eq? m 'insert!) insert!)
57 ((eq? m 'print) local-table)
58 (else (error "Unknown operation -- TABLE" m))))
59 dispatch)