; word sets
(define (alpha-set cs)
(let ((s (make-vector 26 #f)))
(do ((cs cs (cdr cs)))
((null? cs) s)
(let ((t (- (char->integer (car cs)) 97)))
(vector-set! s t #t)))))
(define (word-set s word)
(let loop ((cs (string->list word)))
(if (null? cs) #t
(let ((t (- (char->integer (car cs)) 97)))
(if (vector-ref s t) (loop (cdr cs)) #f)))))
(define s (alpha-set '(#\a #\c #\t)))
(display (word-set s "act")) (newline)
(display (word-set s "tact")) (newline)
(display (word-set s "stop")) (newline)
(define (alpha-count cs)
(let ((c (make-vector 26 0)))
(do ((cs cs (cdr cs)))
((null? cs) c)
(let ((t (- (char->integer (car cs)) 97)))
(vector-set! c t (+ (vector-ref c t) 1))))))
(define (word-count c word)
(let ((c (vector-copy c)))
(let loop ((cs (string->list word)))
(if (null? cs) #t
(let ((t (- (char->integer (car cs)) 97)))
(vector-set! c t (- (vector-ref c t) 1))
(if (negative? (vector-ref c t)) #f
(loop (cdr cs))))))))
(define c (alpha-count '(#\a #\c #\t)))
(display (word-count c "act")) (newline)
(display (word-count c "tact")) (newline)
(display (word-count c "stop")) (newline)