fork download
  1. ; self-organizing lists
  2.  
  3. (define (box v) (vector v))
  4. (define (unbox box) (vector-ref box 0))
  5. (define (box! box v) (vector-set! box 0 v))
  6.  
  7. (define (set-create) (box (list)))
  8.  
  9. (define (set-member? x xs)
  10. (let loop ((front (list)) (back (unbox xs)))
  11. (cond ((null? back) #f)
  12. ((equal? x (car back))
  13. (box! xs (append (list (car back))
  14. (reverse front)
  15. (cdr back)))
  16. #t)
  17. (else (loop (cons (car back) front)
  18. (cdr back))))))
  19.  
  20. (define (set-insert! x xs)
  21. (if (not (set-member? x xs))
  22. (box! xs (cons x (unbox xs))))
  23. xs)
  24.  
  25. (define (set-delete! x xs)
  26. (if (set-member? x xs)
  27. (box! xs (cdr (unbox xs))))
  28. xs)
  29.  
  30. (define xs (set-create))
  31. (display (set-insert! 1 xs)) (newline)
  32. (display (set-insert! 2 xs)) (newline)
  33. (display (set-insert! 3 xs)) (newline)
  34. (display (set-member? 1 xs)) (newline)
  35. (display xs) (newline)
  36. (display (set-delete! 2 xs)) (newline)
  37. (display (set-delete! 1 xs)) (newline)
  38. (display (set-delete! 3 xs)) (newline)
  39. (display (set-member? 1 xs)) (newline)
Success #stdin #stdout 0s 7268KB
stdin
Standard input is empty
stdout
#((1))
#((2 1))
#((3 2 1))
#t
#((1 3 2))
#((1 3))
#((3))
#(())
#f