2015/11/20

SICP 問題 3.22

局所状態を持つ手続きとしてキューを定義する.

(define (insert-queue! queue item)
  ((queue 'insert-queue!) item))

(define (delete-queue! queue)
  ((queue 'delete-queue!)))

(define (make-queue)
  (let ((front-ptr '())
        (rear-ptr '()))
    (define (empty-queue?)
      (null? front-ptr))
    (define (insert-queue! item)
      (let ((new-item (list item)))
        (cond ((empty-queue?)
               (set! front-ptr new-item)
               (set! rear-ptr new-item)
               front-ptr)
              (else
               (set-cdr! rear-ptr new-item)
               (set! rear-ptr new-item)
               front-ptr))))
    (define (delete-queue!)
      (cond ((empty-queue?)
             (error "DELETE called with an empty queue" front-ptr))
            (else
             (set! front-ptr (cdr front-ptr))
             front-ptr)))
    (define (dispatch m)
      (cond ((eq? m 'insert-queue!)
             insert-queue!)
            ((eq? m 'delete-queue!)
             delete-queue!)
            (else
             (error "Undefined operation -- MAKE-QUEUE" m))))
    dispatch))
gosh> (define q1 (make-queue))
q1
gosh> (insert-queue! q1 'a)
(a)
gosh> (insert-queue! q1 'b)
(a b)
gosh> (delete-queue! q1)
(b)

© 2022 wat-aro