Open Source WEB

##(link2sicp "book-Z-H-22.html#%_thm_3.22" "Exercise 3.22")

解答例

(define (make-queue)
  (let ((front-ptr '())
        (rear-ptr '()))
  (define (set-front-ptr! item) (set! front-ptr item))
  (define (set-rear-ptr! item) (set! rear-ptr item))
  (define (empty-queue?) (null? front-ptr))
  (define (front-queue)
    (if (empty-queue?)
        (error "FRONT called with an empty queue")
        front-ptr))
  (define (insert-queue! item)
    (let ((new-pair (cons item '())))
      (cond ((empty-queue?)
             (set-front-ptr! new-pair)
             (set-rear-ptr! new-pair)
             (front-queue))
            (else
             (set-cdr! rear-ptr new-pair)
             (set-rear-ptr! new-pair)
             (front-queue)))))
  (define (delete-queue!)
    (cond ((empty-queue?)
           (error "DELETE! called with an empty queue"))
          (else
           (set-front-ptr! (cdr front-ptr))
           (if (empty-queue?)
               'empty-queue
               (front-queue)))))
  (define (dispatch m)
    (cond ((eq? m 'insert!) insert-queue!)
          ((eq? m 'delete!) (delete-queue!))
          ((eq? m 'print) (front-queue))
          (else
           (error "Undefined operation -- DISPATCH" m))))
  dispatch))

(define (insert-queue! queue item) ((queue 'insert!) item))
(define (delete-queue! queue) (queue 'delete!))
(define (print-queue queue) (queue 'print))

実行例

gosh> (define q (make-queue))
q
gosh> (print-queue q)
*** ERROR: FRONT called with an empty queue
gosh> (insert-queue! q 'a)
(a)
gosh> (print-queue q)
(a)
gosh> (insert-queue! q 'b)
(a b)
gosh> (print-queue q)
(a b)
gosh> (delete-queue! q)
(b)
gosh> (print-queue q)
(b)
gosh> (delete-queue! q)
empty-queue
gosh> (print-queue q)
*** ERROR: FRONT called with an empty queue

--hidenao

コード

##(sicp-answer-code "ex-3.22.scm")

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us