现在是为了这段代码而编写的图表:显示包含少于 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 个单词或符号的函数定义,1,027 个包含 10 到 19 个单词或符号的函数定义,955 个包含 20 到 29 个单词或符号的函数定义,依此类推。
显然,仅通过查看这个列表,我们就可以看到大多数函数定义包含十到三十个单词和符号。
现在是打印的时候。我们 不希望打印一个高达 1,030 行的图表 … 相反,我们应该打印一个不到二十五行高的图表。这样高度的图表可以显示在几乎任何显示器上,并且可以轻松地打印在一张纸上。
这意味着 list-for-graph
中的每个值必须减少到其当前值的五十分之一。
这里是一个用两个我们还没有看到的函数,mapcar
和 lambda
,来做到这一点的简短函数。
(defun one-fiftieth (full-range) "返回一个列表,其中每个数字是先前值的五十分之一。" (mapcar (lambda (arg) (/ arg 50)) full-range))