--- title: SICP persistent O(n) queue date: 2021-09-03 layout: post lang: en ref: sicp-persistent-on-queue --- ```scheme (define (queue) (cons '() '())) (define (enqueue x q) (cons (car q) (cons x (cdr q)))) (define (flush q) (cons (reverse (cdr q)) '())) (define (dequeue q) (if (null? (car q)) (dequeue (flush q)) (cons (caar q) (cons (cdar q) (cdr q))))) (define (empty? q) (and (null? (car q)) (null? (cdr q)))) (define (peek q) (car (dequeue q))) (define (print-queue q) (define (rec l leading-space?) (when (not (null? l)) (when leading-space? (display " ")) (display (car l)) (rec (cdr l) #t))) (display "#q(") (rec (car q) false) (rec (reverse (cdr q)) (not (null? (car q)))) (display ")") (newline)) ``` Sample interactive session: ```scheme scheme@(guile-user)> (define true #t) scheme@(guile-user)> (define false #f) scheme@(guile-user)> (define q (queue)) scheme@(guile-user)> (print-queue q) #q() scheme@(guile-user)> (print-queue (enqueue 'a q)) #q(a) scheme@(guile-user)> (print-queue q) #q() scheme@(guile-user)> (set! q (enqueue 'a q)) scheme@(guile-user)> (print-queue q) #q(a) scheme@(guile-user)> (set! q (enqueue 'e (enqueue 'd (enqueue 'c (enqueue 'b q))))) scheme@(guile-user)> (print-queue q) #q(e d c b a) scheme@(guile-user)> (peek q) $28 = a scheme@(guile-user)> (define ret (dequeue q)) scheme@(guile-user)> (define value (car ret)) scheme@(guile-user)> (set! q (cdr ret)) scheme@(guile-user)> value $29 = a scheme@(guile-user)> (print-queue q) #q(b c d e) scheme@(guile-user)> (print-queue (cdr (dequeue (cdr (dequeue (enqueue 'g (enqueue 'f q))))))) #q(d e f g) ```