問題3.22

(define (make-queue)
  (let ((front-ptr '())
        (rear-ptr '()))
    (define (empty?) (null? front-ptr))
    (define (set-front-ptr! item) (set! front-ptr item))
    (define (set-rear-ptr! item) (set! rear-ptr item))
    (define (insert! item)
      (let ((new-pair (cons item '())))
        (if (empty?)
            (begin (set-front-ptr! new-pair)
                   (set-rear-ptr!  new-pair)
                   #f)
            (begin (set-cdr! rear-ptr new-pair)
                   (set-rear-ptr! new-pair)
                   #f))))
    (define (delete!)
      (if (empty?)
          (error "DELETE! called with an empty queue.")
          (begin (set-front-ptr! (cdr front-ptr))
                 #f)))
    (define (front)
      (if (empty?)
          (error "FRONT called with an empty queue")
          (car front-ptr)))

    (define (print-queue)
      (print front-ptr))

    (define (dispatch m)
      (cond ((eq? m 'insert!) insert!)
            ((eq? m 'delete!) delete!)
            ((eq? m 'front) front)
            ((eq? m 'empty?) empty?)
            ((eq? m 'print) print-queue)
            (else (error "Undefined operation -- " m))))

    dispatch))

(define q1 (make-queue))

((q1 'insert!) 1)

(define q1 (make-queue))
((q1 'insert!) 1)
((q1 'insert!) 2)
((q1 'insert!) 3)
((q1 'insert!) 4)
((q1 'insert!) 5)

((q1 'print))
; -> (1 2 3 4 5)

((q1 'delete!))
((q1 'delete!))
((q1 'delete!))
((q1 'print))
; -> (4 5)

((q1 'insert!) 6)
((q1 'print))
; -> (4 5 6)