2015/11/20
SICP 問題 3.22
局所状態を持つ手続きとしてキューを定義する.
(define (insert-queue! queue item)
((queue 'insert-queue!) item))
(define (delete-queue! queue)
((queue 'delete-queue!)))
(define (make-queue)
(let ((front-ptr '())
(rear-ptr '()))
(define (empty-queue?)
(null? front-ptr))
(define (insert-queue! item)
(let ((new-item (list item)))
(cond ((empty-queue?)
(set! front-ptr new-item)
(set! rear-ptr new-item)
front-ptr)
(else
(set-cdr! rear-ptr new-item)
(set! rear-ptr new-item)
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)
(cond ((eq? m 'insert-queue!)
insert-queue!)
((eq? m 'delete-queue!)
delete-queue!)
(else
(error "Undefined operation -- MAKE-QUEUE" m))))
dispatch))
gosh> (define q1 (make-queue))
q1
gosh> (insert-queue! q1 'a)
(a)
gosh> (insert-queue! q1 'b)
(a b)
gosh> (delete-queue! q1)
(b)