さて、これらすべてのコードを書いた目的であるグラフを見てみましょう。これは、関数定義のうち、単語と記号の合計が10個未満のものがいくつあり、10個から19個のものがいくつあり、20個から29個のものがいくつあるか、といった具合に示すグラフです。
これは複数の手順からなるプロセスです。まず、必要なコードをすべて読み込んでいるか確認してください。
top-of-ranges
に別の値を設定している場合は、その値をリセットしておくとよいでしょう。以下を評価してみてください。
(setq top-of-ranges '(10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300)
次に、各範囲における単語数と記号数のリストを作成します。
以下を評価してください:
(setq list-for-graph
(defuns-per-range
(sort
(recursive-lengths-list-many-files
(directory-files "/usr/local/emacs/lisp"
t ".+el$"))
'<)
top-of-ranges))
古いマシンでは、これに1時間ほどかかった。手元のEmacsバージョン19.23で303個のLispファイルを走査した。それだけの計算を経て、list-for-graphは次の値になった:
(537 1027 955 785 594 483 349 292 224 199 166 120 116 99 90 80 67 48 52 45 41 33 28 26 25 20 12 28 11 13 220)
つまり、私の手元のEmacsには、単語や記号が10個未満の関数定義が537個、10〜19個のものが1,027個、20〜29個のものが955個、といった具合にあったということだ。
明らかに、このリストを見るだけで、ほとんどの関数定義が10語から30語の単語や記号で構成されていることがわかります。
次は印刷についてです。高さ1,030行もあるグラフを印刷したいとは思いません……。むしろ、高さ25行未満のグラフを印刷すべきです。それくらいの高さのグラフであれば、ほぼあらゆるモニターで表示でき、紙にも簡単に印刷できます。
つまり、list-for-graphの各値を現在の値の50分の1に低減させる必要があります。
まだ見ていない2つの関数 mapcar と lambda を使って、まさにそれを実現する短い関数を以下に示します。
(defun one-fiftieth (full-range) "Return list, each number one-fiftieth of previous." (mapcar (lambda (arg) (/ arg 50)) full-range))