; sets without replacement

(define s (list)) ; set of current items
(define t (list)) ; tombstones of deleted items

(define (add s x) ; add x to set s
  (if (member x s)
      (error 'add "can't add already existent element")
      (if (member x t)
          (error 'add "can't add previously existent element")
          (begin (set! s (cons x s)) s))))

(define (del s x) ; remove x from set s
  (if (not (member x s))
      (error 'del "can't delete non-existent element")
      (begin (set! s (remove x s))
             (set! t (cons x t))
             s)))

(set! s (add s 1))
(set! s (add s 3))
(set! s (add s 5))

(set! s (add s 3))
(set! s (del s 3))
(set! s (add s 3))