(require 'rep.test.framework) ;; FIXME better logic (see queues.jl in rep.data.queues): ;; enqueue: append item at back of queue ;; dequeue: take car of queue (define (make-queue) (let ((q '())) (define (enqueue x) (setq q (cons x q))) (define (dequeue) (if (null q) (error "Empty queue -- dequeue") (let ((item (last q))) (setq q (nreverse (cdr (nreverse q)))) item))) (define (initialize) (setq q '()) 'done) (define (dispatch message) (cond ((eq message 'enqueue) enqueue) ((eq message 'dequeue) (dequeue)) ((eq message 'initialize) (initialize)) (t (error "Unknown request -- queue: %s" message)))) dispatch)) (define (dequeue queue) (queue 'dequeue)) (define (enqueue queue value) ((queue 'enqueue) value)) (defvar qq (make-queue)) (enqueue qq 3) (enqueue qq 4) (assert (= 3 (dequeue qq))) (assert (= 4 (dequeue qq)))