C.4.2 用图表展示函数定义中的单词与符号数量

现在到了编写所有这些代码的最终目的:生成一张图表,展示有多少函数定义包含少于 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))

在我老旧的机器上,这花了大约一个小时。它遍历了我这份 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 里,有 537 个函数定义包含少于 10 个单词或符号,1027 个包含 10–19 个,955 个包含 20–29 个,依此类推。

显然,只看这个列表就能发现,大多数函数定义包含 10 到 30 个单词和符号。

接下来开始打印。我们 不希望 打印一张高达 1030 行的图表……相反,应该打印一张高度少于 25 行的图表。这个高度几乎能在任何显示器上显示,也能轻松打印在一张纸上。

这意味着 list-for-graph 中的每个数值都要缩小到原来的五十分之一。

下面是一个实现该功能的简短函数,它用到了两个我们还没见过的函数:mapcarlambda

(defun one-fiftieth (full-range)
  "返回一个列表,其中每个数字为原数字的五十分之一。"
 (mapcar (lambda (arg) (/ arg 50)) full-range))