aboutsummaryrefslogblamecommitdiff
path: root/src/content/pastebins/2021/09/03/sicp-persistent-queue.adoc
blob: 8cf7ea26c907c1705d31ed2c97cf2ccbda7c4b81 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

   
                                           






                
                                       









































































                                                                                              
---

title: SICP persistent amortized O(1) queue

date: 2021-09-03

layout: post

lang: en

ref: sicp-persistent-amortized-o1-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)
```