;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; LQUEUE ; ; Queue implemented using a list (scm list) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define queue (make-record-type "queue" '(lq))) (define create-queue (record-constructor queue '(lq))) (define (make-queue) (create-queue '())) ;;; ;;; make a queue, and it's empty ;;; (define queue? (record-predicate queue)) (define lq (record-accessor queue 'lq)) (define lq! (record-modifier queue 'lq)) (define (empty? q) (null? (lq q))) (define q (make-queue)) (define (enqueue e q) (lq! q (append (lq q) (list e)))) (define (dequeue q) (cond ((empty? q) 'underflow) (t (let ((e (car (lq q)))) (lq! q (cdr (lq q))) e)))) (define (front q) (cond ((empty? q) 'empty) (t (car (lq q))))) ;;; ;;; NOTE that how append operates is outwith our control ;;; consequently this "could" be a very inefficient implementation ;;; of a queue, but it is simple, it works, it allows the ;;; queue to grow to a size limited only by virtual memeory (vm) ;;; and it is simple (you guessed, I like simplicity) ;;; ;;;