SICP第三章中表格的实现

一维表格
将这种表格实现为一个记录的表,其中每个记录将实现为由一个关键码和一个关联值组成的序对
将这种记录连接起来构成一个序对的表,让这些序对的car指针顺序指向各个记录。
为了使表格里加入记录时能有一个可以修改的位置,我们将构造一种带表头单元的表。带表头单元的表在开始处有一个特殊的骨架序对,其中保存着一个哑“记录”

lookup过程从表格里提取信息,以一个关键码为参数,返回与之关联的值或者假。

(define (lookup key table)
  (let ((record (assoc key (cdr table))))  ;(cdr table)跳过了哑记录
    (if record
        (cdr record)
        false)))
(define (assoc key records)
  (cond ((null? records) false)
        ((equal? key (caar records)) (car records))
        (else (assoc key (cdr records)))))

insert!过程在一个表格里的某个特定的关键码下插入一个值

(define (insert! key value table)
  (let ((record (assoc key (cdr table))))
    (if record
        (set-cdr! record value)
        (ser-cdr! table
                  (cons (cons key value) (cdr table)))))
  'ok)

构建一个新表格

(define (make-table)
  (list '*table*))

两维表格
每个值由两个关键码索引。

(define (assoc key records)
  (cond ((null? records) false)
        ((equal? key (caar records)) (car records))
        (else (assoc key (cdr records)))))

(define (lookup key-1 key-2 table)
  (let ((subtable (assoc key-1 (cdr table))))
    (if subtable
        (let ((record (assoc key-2 (cdr subtable))))
          (if record (cdr record) false))
        false)))

(define (insert! key-1 key-2 value table)
  (let ((subtable (assoc key-1 (cdr 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! table
                  (cons (list key-1 (cons key-2 value)) (cdr table)))))
  'ok)

(define (make-table)
  (list '*table*))

你可能感兴趣的:(sicp)