diff --git a/3_22.rkt b/3_22.rkt new file mode 100644 index 0000000..3a8d696 --- /dev/null +++ b/3_22.rkt @@ -0,0 +1,46 @@ +#lang sicp + +(define (make-queue) + (let ((front-ptr '()) + (rear-ptr '())) + (define (front) + (cond ((empty?) + (error "FRONT called with empty queue")) + (else + (car front-ptr)))) + (define (insert! item) + (let ((new-pair (cons item '()))) + (cond ((empty?) + (set! front-ptr new-pair) + (set! rear-ptr new-pair)) + (else + (set-cdr! rear-ptr new-pair) + (set! rear-ptr new-pair))))) + (define (delete!) + (cond ((empty?) + (error "DELETE! called with empty queue")) + (else + (set! front-ptr (cdr front-ptr))))) + (define (dispatch m) + (cond ((eq? m 'empty?) + (null? front-ptr)) + ((eq? m 'front) (front)) + ((eq? m 'insert!) insert!) + ((eq? m 'delete!) (delete!)) + ((eq? m 'print) + (display front-ptr) + (newline)) + (else + (error "Unknown method: " m)))) + dispatch)) + +(define q1 (make-queue)) +(q1 'print) +((q1 'insert!) 'a) +(q1 'print) +((q1 'insert!) 'b) +(q1 'print) +(q1 'front) +(q1 'print) +(q1 'delete!) +(q1 'print)