Here is a solution to 3.22
(define (make-queue) (let ((front-ptr '()) (rear-ptr '())) (define (empty-queue?) (and (null? front-ptr) (null? rear-ptr))) (define (set-front-ptr! pair) (set! front-ptr pair)) (define (set-rear-ptr! pair) (set! rear-ptr pair)) (define (insert! item) (let ((new-pair (list 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))))) (define (delete!) (cond ((empty-queue?) (error "Empty queue!")) (else (let ((item (car front-ptr))) (set-front-ptr! (cdr front-ptr)) (if (null? front-ptr) (set-rear-ptr! '())) item)))) (define (peek) (if (empty-queue?) (error "Empty queue!") (car front-ptr))) (define (show) (show-helper front-ptr)) (define (show-helper list) (cond ((null? list) '()) (else (cons (car list) (show-helper (cdr list)))))) (define (dispatch m) (cond ((eq? m 'insert!) insert!) ((eq? m 'delete!) delete!) ((eq? m 'peek) peek) ; peek and show added for testing ((eq? m 'show) show))) ; convenience dispatch))