当解释器打印出 ((a b) b)
的时候,实际上是将 q1
变量的 car
和 cdr
部分都打印了出来,其中 car
的部分指向 (a b)
,而 cdr
部分指向 b
,这不仅暴露了队列的底层实现,而且还会让人造成误会(像 Louis 那样)。
要解决这个问题,我们可以使用一个只返回队列 car
部分的过程来作为打印队列中的值:
;;; 21-print-queue.scm
(define (print-queue queue)
(car queue))
测试:
1 ]=> (load "p181-queue.scm")
;Loading "p181-queue.scm"... done
;Value: delete-queue!
1 ]=> (load "21-print-queue.scm")
;Loading "21-print-queue.scm"... done
;Value: print-queue
1 ]=> (define q1 (make-queue))
;Value: q1
1 ]=> (print-queue q1)
;Value: ()
1 ]=> (insert-queue! q1 'a)
;Value 13: ((a) a)
1 ]=> (print-queue q1)
;Value 14: (a)
1 ]=> (insert-queue! q1 'b)
;Value 13: ((a b) b)
1 ]=> (print-queue q1)
;Value 14: (a b)
1 ]=> (delete-queue! q1)
;Value 13: ((b) b)
1 ]=> (print-queue q1)
;Value 15: (b)
1 ]=> (delete-queue! q1)
;Value 13: (() b)
1 ]=> (print-queue q1)
;Value: ()
可以看到,在队列为空、新元素入队和前端元素出队这三种情况下, print-queue
都可以正确地打印队列中的元素。
(实际上,打印是由解释器完成的, print-queue
只是负责将队列中合适的部分返回给解释器而已。)