;; A Queue is a ;; (list Listof[SchemeValue] Listof[SchemeValue]) ;; ;; interpretation: ;; A Queue (F R) is the sequence (append F (reverse R)) ;; ;; INVARIANT: for any Queue (F R), F is null only if R is null. ;; empty : -> Queue (define empty (lambda () (list '() '()))) ;; snoc : Queue SchemeValue -> Queue (define snoc (lambda (q v) (cond ;; question: why do we know the first clause below is okay? ((null? (car q)) (list (list v) '())) (else (list (car q) (cons v (cadr q))))))) ;; isEmpty: Queue -> Boolean (define isEmpty (lambda (q) (and (null? (car q)) (null? (cadr q))))) ;; head : Queue -> SchemeValue (define head (lambda (q) (car (car q)))) ;; tail : Queue -> Queue (define tail (lambda (q) (cond ((null? (cdr (car q))) (list (reverse (cadr q)) '())) (else (list (cdr (car q)) (cadr q))))))