hand-woven DLLs added by wasamasa on Fri Jun 10 22:34:15 2016

(define-record dll storage start end)
(define-record dll-cell id label prev next)

(define items (make-dll '() #f #f))

(define foo (make-dll-cell 1 #f #f #f))
(dll-storage-set! items (cons foo (dll-storage items)))
(dll-start-set! items foo)
(dll-end-set! items foo)

(define bar (make-dll-cell 2 #f #f #f))
(dll-storage-set! items (cons bar (dll-storage items)))
(dll-cell-prev-set! bar (dll-end items))
(dll-cell-next-set! (dll-end items) bar)
(dll-end-set! items bar)

(define baz (make-dll-cell 3 #f #f #f))
(dll-storage-set! items (cons baz (dll-storage items)))
(dll-cell-prev-set! baz (dll-end items))
(dll-cell-next-set! (dll-end items) baz)
(dll-end-set! items baz)

(dll-cell-label-set! foo "Foo")
(dll-cell-label-set! bar "Bar")
(dll-cell-label-set! baz "Baz")

;; forward
(let loop ((item (dll-start items)))
  (printf "Cell ~a: ~a\n" (dll-cell-id item) (dll-cell-label item))
  (when (dll-cell-next item)
    (loop (dll-cell-next item))))

;; backward
(let loop ((item (dll-end items)))
  (printf "Cell ~a: ~a\n" (dll-cell-id item) (dll-cell-label item))
  (when (dll-cell-prev item)
    (loop (dll-cell-prev item))))