(define make-queue (lambda () (cons '() '()))) (define empty-queue? (lambda (q) (eq? (car q) '()))) (define enqueue! (lambda (obj q) (let ((x (cons obj '()))) (if (null? (car q)) (set-car! q x) (set-cdr! (cdr q) x)) (set-cdr! q x)))) (define dequeue! (lambda (q) (if (null? (car q)) (error 'dequeue! "cannot dequeue from empty queue") (let ((obj (caar q))) (set-car! q (cdar q)) (if (null? (car q)) (set-cdr! q '())) obj)))) ;;; > (define q (make-queue)) ;;; > q ;;; (()) ;;; > (enqueue! 'a q) ;;; > q ;;; ((a) a) ;;; > (enqueue! 'b q) ;;; > (enqueue! 'c q) ;;; > q ;;; ((a b c) c) ;;; > (dequeue! q) ;;; a ;;; > q ;;; ((b c) c) ;;; > (dequeue! q) ;;; b ;;; > (dequeue! q) ;;; c ;;; > (dequeue! q) ;;; ;;; Error in dequeue!: cannot dequeue from empty queue. ;;; Type (debug) to enter the debugger. ;;; >