3.24 Exercise 3.24
This exercise is pretty easy given the implementation of make-table
on the previous page. We just need to create a generic assoc procedure
that can be called within our new make-table variant.
(define (generic-assoc key records same-key?) | (cond ((null? records) false) | ((same-key? key (caar records)) (car records)) | (else (generic-assoc key (cdr records) same-key?)))) |
|
(define (make-table same-key?) | (let ((assoc (lambda (key records) (generic-assoc key records same-key?))) | (local-table (list '*table*))) | (define (lookup key-1 key-2) | (let ((subtable (assoc key-1 (cdr local-table)))) | (if subtable | (let ((record (assoc key-2 (cdr subtable)))) | (if record | (cdr record) | false)) | false))) | (define (insert! key-1 key-2 value) | (let ((subtable (assoc key-1 (cdr local-table)))) | (if subtable | (let ((record (assoc key-2 (cdr subtable)))) | (if record | (set-cdr! record value) | (set-cdr! subtable | (cons (cons key-2 value) | (cdr subtable))))) | (set-cdr! local-table | (cons (list key-1 | (cons key-2 value)) | (cdr local-table))))) | 'ok) | (define (dispatch m) | (cond ((eq? m 'lookup-proc) lookup) | ((eq? m 'insert-proc!) insert!) | (else (error "Unknown operation -- TABLE" m)))) | dispatch)) |
|