(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))
((q1 'delete!))
((q1 'delete!))
((q1 'delete!))
((q1 'print))
((q1 'insert!) 6)
((q1 'print))