Saturday, July 10, 2010

Ex 3.22 of SICP Presenting queue with local state

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

No comments:

Post a Comment