#lang scheme (define (line->words line) (let ((my-line (string-append line " "))) (let loop ((start 0) (end 0) (ret '())) (cond ((>= end (string-length my-line)) ret) ((char-alphabetic? (string-ref my-line end)) (loop start (+ end 1) ret)) (else (loop (+ end 1) (+ end 1) (if (> end start) (cons (substring my-line start end) ret) ret))))))) (let ((words (make-hasheq))) (let loop () (let ((l (read-line))) (unless (eof-object? l) (for-each (lambda (w) (let ((k (string->symbol w))) (hash-set! words k (+ (hash-ref words k 0) 1)))) (line->words l)) (loop)))) (for-each (lambda (x) (printf "~a ~a~n" (car x) (cdr x))) (sort (hash-map words (lambda (k v) (cons (symbol->string k) v))) > #:key cdr)))