+#lang r5rs
+
+(define (lookup key table)
+ (let ((record (assoc key (cdr table))))
+ (if record
+ (cdr record)
+ #f)))
+
+(define (assoc key records)
+ (cond ((null? records) #f)
+ ((equal? key (caar records)) (car records))
+ (else (assoc key (cdr records)))))
+
+(define (insert! key value table)
+ (let ((record (assoc key (cdr table))))
+ (if record
+ (set-cdr! record value)
+ (set-cdr! table
+ (cons (cons key value) (cdr table)))))
+ 'ok)
+
+(define (assoc-in key-list records)
+ (if (not (null? key-list))
+ (if (not (null? (cdr key-list)))
+ (assoc-in (cdr key-list)
+ (assoc (car key-list) (cdr records)))
+ (assoc (car key-list) (cdr records)))
+ #f))
+
+(define (lookup-in key-list records)
+ (let ((record (assoc-in key-list records)))
+ (if record
+ (cdr record)
+ #f)))
+
+(define (form-table keys value)
+ (cond
+ ((null? (cdr keys)) (cons (car keys) value))
+ (else (list (car keys)
+ (form-table (cdr keys) value)))))
+
+(define (insert-in! key-list value records)
+ (let loop ((k (car key-list))
+ (ks (cdr key-list))
+ (table (cdr records)))
+ (let ((record (assoc k table)))
+ (if record
+ (if (null? ks)
+ (set-cdr! record value)
+ (loop (car ks) (cdr ks) (cdr record)))
+ (if (null? ks)
+ (set-cdr! table
+ (cons (cons k value)
+ (cdr table)))
+ (set-cdr! records
+ (cons (list k
+ (form-table ks value))
+ (cdr records))))))))
+
+
+
+
+
+#|
+> (define t (list '*table*
+ (list 'math
+ (cons '+ 43)
+ (cons '- 45)
+ (cons '* 42))
+ (list 'letters
+ (cons 'a 97)
+ (cons 'b 98))))
+
+> (lookup-in '(math +) t)
+43
+> (lookup-in '(math /) t)
+#f
+> (lookup-in '(letters /) t)
+#f
+> (lookup-in '(letters a) t)
+97
+>
+|#