; entropy

(define (log2 x) (/ (log x) (log 2)))

(define (entropy filename)
  (with-input-from-file filename (lambda ()
    (let ((freqs (make-vector 256 0)) (ent 0.0))
      (let loop ((c (read-char)) (len 0))
        (if (not (eof-object? c))
            (let ((i (char-&gt;integer c)))
              (vector-set! freqs i
                (+ (vector-ref freqs i) 1))
              (loop (read-char) (+ len 1)))
            (do ((k 0 (+ k 1)))
                ((= k 256) (- ent))
              (let ((freq (vector-ref freqs k)))
                (when (positive? freq)
                  (let ((x (/ freq len)))
                    (set! ent (+ ent (* x (log2 x))))))))))))))

(display (entropy "entropy.ss")) (newline)