; this is assuming that the input is case-insensitive ; despite a unique word count implying words and not 'words with following or ; leading punctuation', this will terminate only on space or newline (define (trie-new) (make-vector 256 0)) (define (trie-insert tr s) (let ((tr (trie-new)) (l (string-length s))) (let loop ((i 0) (t tr)) (if (= i l) (begin (vector-set! t 0 (+ 1 (vector-ref t 0))) tr) (let ((c (char->integer (char-downcase (string-ref s i))))) (cond ((or (= 32 c) (= 10 c)) ; 32 = #\space 10 = #\newline (vector-set! t 0 (+ 1 (vector-ref t 0))) (loop (+ 1 i) tr)) ((vector? (vector-ref t c)) (loop (+ 1 i) (vector-ref t c))) (else (let ((tn (trie-new))) (vector-set! tn 0 (vector-ref t c)) (vector-set! t c tn) (loop (+ 1 i) tn)))))))))