; helpers, hidden inside abstraction
(define (front-ptr q) (cadr q))
(define (rear-ptr q) (cddr q))
(define (set-front-ptr! q item)
(define (set-rear-ptr! q item)
(cons 'queue (cons nil nil)))
(and (pair? q) (eq? 'queue (car q))))
(error "object not a queue: " q)
(error "front of empty queue: " q)
(error "delete of empty queue: " q))
(define (insert-queue q elt)
(let ((new-pair (cons elt nil)))
(set-front-ptr! q new-pair)
(set-rear-ptr! q new-pair)
(set-cdr! (rear-ptr q) new-pair)
(set-rear-ptr! q new-pair)