;; C311 Assignment 10. Simple Object Oriented Programming ;; ;; (define make-queue (let ((num-queues 0)) (lambda () (set! num-queues (+ num-queues 1)) (let ((queue (list 'queue))) (let ((head queue) (tail queue)) (lambda (message) (case message ((num-queues) num-queues) ((enqueue) (lambda (x) (set-cdr! tail (cons x '())) (set! tail (cdr tail)))) ((dequeue) (if (null? (cdr head)) (error 'dequeue "Underflow") (begin (set! head (cdr head)) (car head)))) (else (error message "Unknown message"))))))))) (define make-bounded-queue (let ((num-bqueues 0)) (lambda (bound) (set! num-bqueues (+ num-bqueues 1)) (let ((size 0) (queue (make-queue))) (lambda (message) (case message ((enqueue) (if (< size bound) (begin (set! size (+ size 1)) (queue message)) (error 'enqueue "Bound ~s exceeded" bound))) ((dequeue) (set! size (- size 1)) (queue message)) ((size) size) ((bound) bound) ((num-bqueues) num-bqueues) (else (queue message))))))))