3 (define (lookup key table)
4 (let ((record (assoc key (cdr table))))
9 (define (assoc key records)
10 (cond ((null? records) #f)
11 ((equal? key (caar records)) (car records))
12 (else (assoc key (cdr records)))))
14 (define (insert! key value table)
15 (let ((record (assoc key (cdr table))))
17 (set-cdr! record value)
19 (cons (cons key value) (cdr table)))))
22 (define (assoc-in key-list records)
23 (if (not (null? key-list))
24 (if (not (null? (cdr key-list)))
25 (assoc-in (cdr key-list)
26 (assoc (car key-list) (cdr records)))
27 (assoc (car key-list) (cdr records)))
30 (define (lookup-in key-list records)
31 (let ((record (assoc-in key-list records)))
36 (define (form-table keys value)
38 ((null? (cdr keys)) (cons (car keys) value))
39 (else (list (car keys)
40 (form-table (cdr keys) value)))))
42 (define (insert-in! key-list value records)
43 (let loop ((k (car key-list))
45 (table (cdr records)))
46 (let ((record (assoc k table)))
49 (set-cdr! record value)
50 (loop (car ks) (cdr ks) (cdr record)))
57 (form-table ks value))
65 > (define t (list '*table*
74 > (lookup-in '(math +) t)
76 > (lookup-in '(math /) t)
78 > (lookup-in '(letters /) t)
80 > (lookup-in '(letters a) t)
86 > (define t (list '*table*
95 (*table* (math (+ . 43) (- . 45) (* . 42)) (letters (a . 97) (b . 98)))
96 > (insert-in! '(earth asia india) 'delhi t)
98 (*table* (earth (asia (india . delhi))) (math (+ . 43) (- . 45) (* . 42)) (letters (a . 97) (b . 98)))
99 > (insert-in! '(math +) 83 t)
101 (*table* (earth (asia (india . delhi))) (math (+ . 83) (- . 45) (* . 42)) (letters (a . 97) (b . 98)))
102 > (insert-in! '(math /) 99 t)
104 (*table* (earth (asia (india . delhi))) (math (+ . 83) (/ . 99) (- . 45) (* . 42)) (letters (a . 97) (b . 98)))