(define (make-queue) (let ((front-ptr '()) (rear-ptr '())) (define (empty?) (null? front-ptr)) (define (front) (if (empty?) (error "FRONT called with an empty queue") (car front-ptr))) (define (insert! item) (let ((new-pair (cons item '()))) (cond ((empty?) (set! front-ptr new-pair) (set! rear-ptr new-pair) front-ptr) (else (set-cdr! rear-ptr new-pair) (set! rear-ptr new-pair) front-ptr)))) (define (delete!) (cond ((empty?) (error "DELETE! called with an empty queue")) (else (set! front-ptr (cdr front-ptr)) front-ptr))) (define (dispatch m) (cond ((eq? m 'empty) (empty?)) ((eq? m 'front) (front)) ((eq? m 'insert) insert!) ((eq? m 'delete) (delete!)) (else (error "DISPATCH called with unknown message" m)))) dispatch)) (define (empty-queue? queue) (queue 'empty)) (define (front-queue queue) (queue 'front)) (define (insert-queue! queue item) ((queue 'insert) item)) (define (delete-queue! queue) (queue 'delete))