; self-organizing lists
(define (box v) (vector v))
(define (unbox box) (vector-ref box 0))
(define (box! box v) (vector-set! box 0 v))
(define (set-create) (box (list)))
(define (set-member? x xs)
(let loop ((front (list)) (back (unbox xs)))
(cond ((null? back) #f)
((equal? x (car back))
(box! xs (append (list (car back))
(reverse front)
(cdr back)))
#t)
(else (loop (cons (car back) front)
(cdr back))))))
(define (set-insert! x xs)
(if (not (set-member? x xs))
(box! xs (cons x (unbox xs))))
xs)
(define (set-delete! x xs)
(if (set-member? x xs)
(box! xs (cdr (unbox xs))))
xs)
(define xs (set-create))
(display (set-insert! 1 xs)) (newline)
(display (set-insert! 2 xs)) (newline)
(display (set-insert! 3 xs)) (newline)
(display (set-member? 1 xs)) (newline)
(display xs) (newline)
(display (set-delete! 2 xs)) (newline)
(display (set-delete! 1 xs)) (newline)
(display (set-delete! 3 xs)) (newline)
(display (set-member? 1 xs)) (newline)