(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))))
kozima
#6449()
[
Common Lisp
]
Rating1/1=1.00
ファイル内のアスキー文字の出現回数をまとめて表示させるようにしました。 仕様上は文字の内部表現がアスキーコードとは限らないので手抜きといえば手抜きかもしれません。
これを使って手元にあった xyzzy のソース src/*.cc と lisp/*.l を比較してみました。
C++ ではループなどでよく使いそうな + と等号、不等号 が多いです。 ブロックに使う {} もかなりの差がありました。 またネーミングの慣習から _ でも大きな差が出ました。
Lisp では予想通り () が多く、割合が C++ の二倍を超えています。 またマクロ文字として使われる # やクオート、バッククオートがたくさん出てきます。 それから \ や ^ の数が多かったのですが、これは正規表現で多用されているようなのでサンプルの性質によるところが大きそうです。 それ以外ではシンボル名に多用される - で大きな差が付いています。 同じくシンボル名に使われる * や format 指定子に使われる ~ も多めでした。
その他の記号類と大文字は C++ の方が多めになるようです。
(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))))Rating1/1=1.00-0+
1 reply [ reply ]