12 (define (cell val prev next)
15 (define cell-prev cadr)
16 (define cell-next caddr)
17 (define (set-cell-prev! cell prev-cell)
18 (set-car! (cdr cell) prev-cell))
19 (define (set-cell-next! cell next-cell)
20 (set-car! (cddr cell) next-cell))
27 (if (not (null? head))
28 (let ((old-head head))
29 (set! head (cell (car args) '() old-head))
30 (set-cell-prev! old-head head))
33 (set! head (cell (car args) '() '()))
36 (let ((old-tail tail))
37 (set! tail (cell-prev old-tail))
40 (set-cell-next! tail '()))
42 ((empty?) (null? head))
44 (let loop ((this-cell head))
47 (cons (cell-val this-cell)
48 (loop (cell-next this-cell))))))))))
50 (define (fifo-push fifo x)
53 (define (fifo-pop fifo)
56 (define (fifo-empty? fifo)
59 (define (fifo->list fifo)