Skip to content

Instantly share code, notes, and snippets.

@supki
Created March 21, 2013 17:39
Show Gist options
  • Select an option

  • Save supki/5214990 to your computer and use it in GitHub Desktop.

Select an option

Save supki/5214990 to your computer and use it in GitHub Desktop.
M
(define (make-queue)
(let ([front-ptr '()]
[rear-ptr '()])
(define (dispatch m)
(cond ([eq? m 'empty-queue?]
(null? front-ptr))
([eq? m 'front-queue]
(if (null? front-ptr)
(error "FRONT called with an empty queue")
(mcar front-ptr)))
([eq? m 'insert-queue!]
(lambda (item)
(let ([new-item (mcons item '())])
(if (null? front-ptr)
(begin
(set! front-ptr new-item)
(set! rear-ptr new-item)
#t)
(begin
(set-mcdr! rear-ptr new-item)
(set! rear-ptr new-item)
#t)))))
([eq? m 'delete-queue!]
(if (null? front-ptr)
(error "DELETE! called with an empty queue")
(set! front-ptr (mcdr front-ptr))))
([eq? m 'print-queue]
(letrec ([queue-to-list (lambda (queue)
(if (null? queue)
'()
(cons (mcar queue) (queue-to-list (mcdr queue)))))])
(display (queue-to-list front-ptr))))
(#t (error "Unknown operation on queue" m))
))
dispatch))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment