1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
(defun frequency (files)
  (let ((v (make-array 127 :initial-element 0)))
    (dolist (file files v)
      (with-open-file (s file :direction :input)
        (loop
          as c = (read-char s nil)
          while (characterp c)
          if (< (char-code c) 127) do (incf (svref v (char-code c))))))))

(defun print-frequency (files)
  (let ((v (frequency files)))
    (format t "~{~4@{~10S ~6D~^ ~}~%~}"
            (loop for n across v and i from 0
              if (plusp n) nconc (list (code-char i) n)))
    (format t "~&Total: ~D characters~%" (reduce #'+ v))))