(define (make-table same-key?) (define records '()) (define (assoc key records) (cond ((null? records) false) ((same-key? key (caar records)) (car records)) (else (assoc key (cdr records))))) (define (lookup key) (let ((record (assoc key records))) (if record (cdr record) false))) (define (insert! key value) (let ((record (assoc key records))) (if record (set-cdr! record value) (set! records (cons (cons key value) records)))) 'ok) (define (dispatch m) (cond ((eq? m 'lookup-proc) lookup) ((eq? m 'insert-proc) insert!) (else (error "Unknown operation -- TABLE" m)))) dispatch) (define (lookup key table) ((table 'lookup-proc) key)) (define (insert! key value table) ((table 'insert-proc) key value)) ; 1 ]=> (define t (make-table (lambda (a b) (= (abs a) (abs b))))) ; ; ;Value: t ; ; 1 ]=> (lookup 1 t) ; ; ;Value: #f ; ; 1 ]=> (lookup -1 t) ; ; ;Value: #f ; ; 1 ]=> (insert! 1 'a t) ; ; ;Value: ok ; ; 1 ]=> (insert! 2 'b t) ; ; ;Value: ok ; ; 1 ]=> (lookup 1 t) ; ; ;Value: a ; ; 1 ]=> (lookup -1 t) ; ; ;Value: a ; ; 1 ]=> (lookup -2 t) ; ; ;Value: b ; ; 1 ]=> (lookup -3 t) ; ; ;Value: #f