;; A Queue is a (Msg -> Procedure) ;; where Msg is one of: ;; - 'snoc => (Value -> Queue) ;; - 'is-empty => (-> Boolean) ;; - 'head => (-> Value) ;; - 'tail => (-> Queue) (define empty 'defined-below) (define snoc (lambda (q v) ((q 'snoc) v))) (define isEmpty (lambda (q) ((q 'is-empty)))) (define head (lambda (q) ((q 'head)))) (define tail (lambda (q) ((q 'tail)))) (letrec ((concrete->object ;; Listof[SchemeValue] Listof[SchemeValue]-> Queue (lambda (F R) (lambda (sym) (cond ((eq? sym 'snoc) (lambda (v) (cond ((null? F) (concrete->object (list v) '())) (else (concrete->object F (cons v R)))))) ((eq? sym 'is-empty) (lambda () (and (null? F) (null? R)))) ((eq? sym 'head) (lambda () (car F))) ((eq? sym 'tail) (lambda () (cond ((null? (cdr F)) (concrete->object (reverse R) '())) (else (concrete->object (cdr F) R))))) ))))) (set! empty (lambda () (concrete->object '() '()))))