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)