Code Review
Compare your solutions
#| BEGIN (Write your solution here) |#
(require compatibility/mlist)
;; -- dispatching table --
(define (make-table)
(let ((local-table (mlist '*table*)))
(define (lookup key-1 key-2)
(let ((subtable (massoc key-1 (mcdr local-table))))
(if subtable
(let ((record (massoc key-2 (mcdr subtable))))
(if record
(mcdr record)
#f))
#f)))
(define (insert! key-1 key-2 value)
(let ((subtable (massoc key-1 (mcdr local-table))))
(if subtable
(let ((record (massoc key-2 (mcdr subtable))))
(if record
(set-mcdr! record value)
(set-mcdr! subtable
(mcons (mcons key-2 value)
(mcdr subtable)))))
(set-mcdr! local-table
(mcons (mlist key-1
(mcons key-2 value))
(mcdr local-table)))))
'ok)
(define (dispatch m)
(cond ((eq? m 'lookup-proc) lookup)
((eq? m 'insert-proc!) insert!)
(else (error "Unknown operation -- TABLE" m))))
dispatch))
(define operation-table (make-table))
(define get (operation-table 'lookup-proc))
(define put (operation-table 'insert-proc!))
;; -- division1 records
(define (install-div1-package)
(define (get-key record key)
(if (null? record)
#f
(let ((pair (car record)))
(if (eq? (car pair) key)
(cdr pair)
(get-key (cdr record) key)))))
(define (get-record records need-name)
(if (null? records)
'()
(let ((record (car records)))
(let ((name (get-key record 'name)))
(if (string=? name need-name)
(attach-tag 'ins1-record record)
(get-record (cdr records) need-name))))))
(define (get-salary record)
(get-key record 'salary))
(put 'get-record 'ins1-record get-record)
(put 'get-salary 'ins1-record get-salary))
;; -- division2 records
(define (install-div2-package)
(define (get-record records need-name)
(if (null? records)
'()
(let ((record (car records)))
(let ((name (car record)))
(if (string=? name need-name)
(attach-tag 'ins2-record record)
(get-record (cdr records) need-name))))))
(define (get-salary record)
(let ((info (cadr record)))
(caddr info)))
(put 'get-record 'ins2-record get-record)
(put 'get-salary 'ins2-record get-salary))
;; -- generic selectors --
(define (get-record records name)
((get 'get-record (type-tag records)) (cdr records) name))
(define (get-salary tagged-record)
((get 'get-salary (type-tag tagged-record)) (cdr tagged-record)))
(define (find-employee-record div-records-list name)
(if (null? div-records-list)
'()
(let ((div-records (car div-records-list)))
(let ((record (get-record div-records name)))
(if (not (null? record))
(cdr record)
(find-employee-record (cdr div-records-list) name))))))
(install-div1-package)
(install-div2-package)
#| END |#