File: queue.ss

package info (click to toggle)
chezscheme 9.5.4%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 61,640 kB
  • sloc: ansic: 17,508; sh: 759; makefile: 509; csh: 423
file content (56 lines) | stat: -rw-r--r-- 1,823 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
;;; queue
;;; an abstract datatype

;;; operations:
;;;    (queue)           ;create a queue object

;;;    if 'q' is a queue object:

;;;    (q 'type?)        ;return the type (queue), useful if there are other
;;;                      ;abstract datatypes floating around.
;;;    (q 'empty?)       ;returns true iff q is empty
;;;    (q 'put val)      ;adds val to end of q; returns val
;;;    (q 'get)          ;removes first element of q and returns it

;;; Examples

;;;    (define! q (queue))
;;;    (q 'type?)             => queue
;;;    (q 'empty?)            => #!true
;;;    (q 'put 3)
;;;    (q 'put 4)
;;;    (q 'put 5)
;;;    (q 'empty?)            => ()
;;;    (q 'get)               => 3
;;;    (q 'get)               => 4
;;;    (q 'put 7)
;;;    (q 'get)               => 5
;;;    (q 'get)               => 7
;;;    (q 'empty?)            => #!true

(define queue
   (lambda ()
      (let ([head '()] [tail '()])
         (lambda (request . args)
            (case request
               [type? 'queue]
               [empty? (null? head)]
               [put
                (let ([v (car args)])
                   (if (null? head)
                       (let ([p (cons v '())])
                          (set! tail p)
                          (set! head p))
                       (let ([quebit (cons v '())])
                          (set-cdr! tail quebit)
                          (set! tail quebit)))
                   v)]
               [get
                (if (null? head)
                    (error 'queue "queue is empty")
                    (let ([v (car head)])
                       (set! head (cdr head))
                       (when (null? head) (set! tail '()))
                       v))]
               [else
                (error 'queue "~s is not a valid request" request)])))))