linked-queue.scm 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees
  3. ; This file is no longer used.
  4. ; Queues implemented as doubly linked lists (because the thread package needs
  5. ; to delete queue entries quickly).
  6. ; The exported procedures are those of the simpler queue package, with the
  7. ; addition of DELETE-QUEUE-ENTRY!. ENQUEUE! returns a queue-entry which can
  8. ; then be passed to DELETE-QUEUE-ENTRY! to remove the thing from the queue.
  9. (define-record-type q-entry :q-entry
  10. (make-q-entry data prev next)
  11. q-entry?
  12. (data q-entry-data)
  13. (prev q-entry-prev set-q-entry-prev!)
  14. (next q-entry-next set-q-entry-next!))
  15. (define queue? q-entry?)
  16. (define (make-queue)
  17. (let ((e (make-q-entry #f #f #f)))
  18. (set-q-entry-prev! e e)
  19. (set-q-entry-next! e e)
  20. e))
  21. (define (queue-empty? q)
  22. (eq? (q-entry-next q) q))
  23. (define (enqueue! q thing)
  24. (let* ((prev (q-entry-prev q))
  25. (e (make-q-entry thing prev q)))
  26. (set-q-entry-prev! q e)
  27. (set-q-entry-next! prev e)
  28. e))
  29. (define (queue-head q)
  30. (let ((e (q-entry-next q)))
  31. (if (eq? q e) ;(queue-empty? q)
  32. (assertion-violation 'queue-head "empty queue" q)
  33. (q-entry-data e))))
  34. (define (dequeue! q)
  35. (let ((e (q-entry-next q)))
  36. (cond ((eq? q e) ;(queue-empty? q)
  37. (assertion-violation 'dequeue! "empty queue" q))
  38. (else
  39. (set-q-entry-next! q (q-entry-next e))
  40. (set-q-entry-prev! (q-entry-next q) q)
  41. (q-entry-data e)))))
  42. (define (delete-queue-entry! e)
  43. (let ((next (q-entry-next e))
  44. (prev (q-entry-prev e)))
  45. (set-q-entry-next! prev next)
  46. (set-q-entry-prev! next prev)))
  47. (define (queue->list q)
  48. (do ((e (q-entry-prev q) (q-entry-prev e))
  49. (l '() (cons (q-entry-data e) l)))
  50. ((eq? q e) l)))
  51. (define (queue-length q)
  52. (do ((e (q-entry-prev q) (q-entry-prev e))
  53. (l 0 (+ l 1)))
  54. ((eq? q e) l)))
  55. (define (delete-from-queue! q v)
  56. (let loop ((e (q-entry-next q)))
  57. (cond ((eq? e q))
  58. ((eq? (q-entry-data e) v)
  59. (delete-queue-entry! e))
  60. (else
  61. (loop (q-entry-next e))))))