1
1
#| queues.jl -- fifo queues
3
$Id: queues.jl,v 1.5 2001/08/08 06:00:19 jsh Exp $
3
$Id: queues.jl,v 1.6 2002/04/14 07:22:40 jsh Exp $
5
5
Copyright (C) 2000 John Harper <john@dcs.warwick.ac.uk>
44
44
(declare (unused q))
45
45
(write stream "#<queue>")))
47
;; Each queue is (TAIL . HEAD). HEAD is the list of items, TAIL
48
;; points to the last cell in HEAD, or the empty list.
47
50
(define (make-queue)
48
(make-datum '() type-id))
51
(make-datum (cons) type-id))
50
53
(define (enqueue q x)
51
(datum-set q type-id (nconc (datum-ref q type-id) (list x))))
54
(let ((cell (datum-ref q type-id))
61
;; tail pointer is set
62
(rplacd (car cell) new)
53
65
(define (dequeue q)
54
(let ((data (datum-ref q type-id)))
66
(let ((cell (datum-ref q type-id)))
56
68
(error "Can't dequeue from empty queue")
57
(datum-set q type-id (cdr data))
69
(prog1 (car (cdr cell))
70
(if (not (eq (car cell) (cdr cell)))
71
;; at least one element left
72
(rplacd cell (cdr (cdr cell)))
73
;; queue needs to be empty now
75
(rplaca cell '()))))))
60
77
(define (queue-empty-p q)
61
(null (datum-ref q type-id)))
78
(null (cdr (datum-ref q type-id))))
64
81
(has-type-p q type-id))
66
83
(define (queue->list q)
67
(datum-ref q type-id))
84
(cdr (datum-ref q type-id)))
69
86
(define (queue-length q)
70
87
(length (queue->list q)))
72
89
(define (delete-from-queue q x)
73
(datum-set q type-id (delq x (datum-ref q type-id))))
90
(let ((cell (datum-ref q type-id)))
91
(let loop ((ptr cell))
93
;; avoid pointing tail to itself..
99
(rplacd ptr (cddr ptr))
101
(loop (cdr ptr)))))))