Saturday, July 25, 2009

Ex-3.22

(define (make-queue)
(let ((front-ptr nil)
(rear-ptr nil))
(define (empty-queue?)
(null? front-ptr))
(define (front-queue)
(if (empty-queue?)
(error "FRONT called with an empty queue" front-ptr)
(car front-ptr)))
(define (insert-queue! item)
(let ((new-pair (cons item '())))
(cond
((empty-queue?)
(set! front-ptr new-pair)
(set! rear-ptr new-pair))
(else
(set-cdr! rear-ptr new-pair)
(set! rear-ptr new-pair))))
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 . args)
(cond
((eq? m 'empty-queue?) (empty-queue?))
((eq? m 'front-queue) (front-queue))
((eq? m 'insert-queue!) (insert-queue! (car args)))
((eq? m 'delete-queue!) (delete-queue!))))
dispatch))

(define (empty-queue? q)
(q 'empty-queue?))
(define (front-queue q)
(q 'front-queue))
(define (insert-queue! q item)
(q 'insert-queue! item))
(define (delete-queue! q)
(q 'delete-queue!))

No comments:

Post a Comment