Code Review

Compare your solutions

    #| BEGIN (Write your solution here) |#
(require racket/mpair)

;; -- node --

(define (make-deque-node value)
  (mcons value (mcons '() '())))

(define (deque-node-value node)
  (mcar node))

(define (deque-node-prev node)
  (mcar (mcdr node)))

(define (deque-node-next node)
  (mcdr (mcdr node)))

(define (deque-node-set-prev! node v)
  (set-mcar! (mcdr node) v))

(define (deque-node-set-next! node v)
  (set-mcdr! (mcdr node) v))

;; -- deque --

(define (make-deque)
  (mcons '() '()))

(define (deque-front-node deque)
  (mcar deque))

(define (deque-rear-node deque)
  (mcdr deque))

(define (deque-set-front-node! deque v)
  (set-mcar! deque v))

(define (deque-set-rear-node! deque v)
  (set-mcdr! deque v))

(define (empty-deque? deque)
  (null? (deque-front-node deque)))

(define (front-deque deque)
  (if (empty-deque? deque)
      (error "FRONT called with an empty queue" deque)
      (deque-node-value (deque-front-node deque))))

(define (rear-deque deque)
  (if (empty-deque? deque)
      (error "REAR called with an empty queue" deque)
      (deque-node-value (deque-rear-node deque))))

(define (front-insert-deque! deque value)
  (let ((node (make-deque-node value)))
    (if (empty-deque? deque)
        (begin
          (deque-set-front-node! deque node)
          (deque-set-rear-node! deque node))
        (begin
          (deque-node-set-next! node (deque-front-node deque))
          (deque-node-set-prev! (deque-front-node deque) node)
          (deque-set-front-node! deque node)))))

(define (rear-insert-deque! deque value)
  (let ((node (make-deque-node value)))
    (if (empty-deque? deque)
        (begin
          (deque-set-front-node! deque node)
          (deque-set-rear-node! deque node))
        (begin
          (deque-node-set-prev! node (deque-rear-node deque))
          (deque-node-set-next! (deque-rear-node deque) node)
          (deque-set-rear-node! deque node)))))

(define (front-delete-deque! deque)
  (if (empty-deque? deque)
      (error "DELETE! called with an empty queue" deque)
      (deque-set-front-node! deque (deque-node-next (deque-front-node deque)))))

(define (rear-delete-deque! deque)
  (if (empty-deque? deque)
      (error "DELETE! called with an empty queue" deque)
      (deque-set-rear-node! deque (deque-node-prev (deque-rear-node deque)))))
#| END |#