(define-module set :imports ("cxr.slime") :exports (make find contains? insert!) (define key-not-found-index -1) (define (make . vals) (set-type! (if vals (list vals) '(())) :set)) (define (find set val) (let ((values (car set))) (define (inner values current-index) (cond ((null? values) key-not-found-index) ((= (car values) val) current-index) (else (inner (cdr values) (+ 1 current-index))))) (inner values 0))) (define (contains? set val) (unless (= (find set val) key-not-found-index) t)) (define (insert! set value) (unless (contains? set value) (set! set (cons (cons value (car set)) ())) (set-type! set :set)) set) )