SICPゼミ第19回

練習問題3.24
(define (make-table same-key?)
  (let ((table (list '*table*)))
    (define (lookup key)
      (let ((record (assoc key (cdr table))))
        (if record
            (cdr record)
            #f)))
    (define (assoc key records)
      (cond ((null? records) #f)
            ((same-key? key (caar records)) (car records))
            (else (assoc key (cdr records)))))
    (define (insert! key value)
      (let ((record (assoc key (cdr table))))
        (if record
            (set-cdr! record value)
            (set-cdr! table
                      (cons (cons key value)
                            (cdr table )))))
      'ok)
    (define (dispatch m)
      (cond ((eq? m 'lookup) lookup)
            ((eq? m 'insert!) insert!)))
    dispatch))

by pine

練習問題3.25
(define (make-table)
  (let ((table (list '*table*)))
    (define (lookup keys)
      (define (lookup-iter keys subtable)
        (let ((record (assoc (car keys) (cdr subtable))))
          (if record
              (if (null? (cdr keys))
                  (cdr record)
                  (lookup-iter (cdr keys) record))
              #f)))
      (lookup-iter keys table))
    (define (assoc key records)
      (cond ((null? records) #f)
            ((equal? key (caar records)) (car records))
            (else (assoc key (cdr records)))))
    (define (insert! keys value)
      (define (insert-iter! keys subtable)
        (let ((record (assoc (car keys) (cdr subtable))))
          (if (null? (cdr keys))
              (if record
                  (set-cdr! record value)
                  (set-cdr! subtable (cons (cons (car keys) value)
                                           (cdr subtable))))
              (if record
                  (insert-iter! (cdr keys) record)
                  (begin
                    (set-cdr! subtable (cons (cons (car keys) nil) (cdr subtable)))
                    (insert-iter! (cdr keys) (cadr subtable)))))))
      (begin
        (insert-iter! keys table)
        'ok))
    (define (dispatch m)
      (cond ((eq? m 'lookup) lookup)
            ((eq? m 'insert!) insert!)
            ((eq? m 'get) table)
            (else (error "Undefined message"))))
    dispatch))

by pine

練習問題3.26
(define (make-multitree n) (cons 'multitree (cons n nil)))

(define (lookup-multitree keys tree)
  (define (lookup-multitree-iter keys tree)
    (if (null? tree)
      #f
      (let ((refkey (caar tree)) (key (car keys)))
        (cond
          ((eq? key refkey) 
            (if (null? (cdr keys))
              (cdar tree)
              (lookup-multitree-iter (cdr keys) (cdar tree))
              )
            )
          ((< key refkey) (lookup-multitree-iter keys (cadr tree)))
          (else (lookup-multitree-iter keys (caddr tree)))
          )
        )
      )
    )
  (lookup-multitree-iter keys (cddr tree))
  )

(define (insert-multitree! keys item tree)
  (define (make-sub-tree keys item)
    (if (null? (cdr keys))
      (list (cons (car keys) item) nil nil)
      (list (cons (car keys) (make-sub-tree (cdr keys) item)) nil nil)
      )
    )
  (define (insert-multitree-iter! keys item tree parent)
    (if (null? tree)
      (set-car! parent (make-sub-tree keys item))
      (let ((refkey (caar tree)) (key (car keys)))
        (cond
          ((eq? refkey key) 
            (if (null? (cdr keys))
              (set-cdr! (car tree) item)
              (insert-multitree-iter! (cdr keys) item (cdar tree) nil)
              )
            )
          ((< key refkey) (insert-multitree-iter! keys item (cadr tree) (cdr tree)))
          (else (insert-multitree-iter! keys item (caddr tree) (cddr tree)))
          )
        )
      )
    )

  (if (eq? (length keys) (cadr tree))
    (if (null? (cddr tree))
      (set! (cddr tree) (make-sub-tree keys item))
      (insert-multitree-iter! keys item (cddr tree) nil)
      )
    (error "hoge")
    )
  )

by dolicas