exercise 3.22
実際できるだろうと分かっても、書いて動かすと何か楽しかった。
(define (make-queue) (let ((front-ptr '()) (rear-ptr '())) (define (set-front-ptr! item) (set! front-ptr item)) (define (set-rear-ptr! item) (set! rear-ptr item)) (define (empty-queue?) (null? front-ptr)) (define (front-queue) (if (empty-queue?) (error "FRONT called with an empty queue" (cons front-ptr rear-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) (cons front-ptr rear-ptr)) (else (set-cdr! rear-ptr new-pair) (set-rear-ptr! new-pair) (cons front-ptr rear-ptr))))) (define (delete-queue!) (cond ((empty-queue?) (error "DELETE called with an empty queue" (cons front-ptr rear-ptr))) (else (set-front-ptr! (cdr front-ptr)) (cons front-ptr rear-ptr)))) (define (print-queue) front-ptr) (define (dispatch m) (cond ((eq? m 'insert-queue!) insert-queue!) ((eq? m 'delete-queue!) (delete-queue!)) ((eq? m 'front-queue) (front-queue)) ((eq? m 'empty-queue?) (empty-queue?)) ((eq? m 'print-queue) (print-queue)) (else (error "Undefined operation make-queue" m)))) dispatch)) (define (empty-queue? z) (z 'empty-queue?)) (define (delete-queue! z) (z 'delete-queue!)) (define (insert-queue! z item) ((z 'insert-queue!) item)) (define (front-queue z) (z 'front-queue)) (define (print-queue z) (z 'print-queue))