14.4 统计一个文件中的多个 defun

simple.el 这样的文件可能包含上百个函数定义。我们的长期目标是收集多个文件的统计数据, 但第一步先实现单个文件的统计。

统计信息是一系列数字,每个数字代表一个函数定义的长度。我们可以将数字保存在列表中。

我们知道后续需要将单个文件的信息与多个文件的信息合并;这意味着用于统计单个文件内定义长度 的函数只需返回长度列表即可,不必也不应该显示任何消息。

单词统计命令包含一个逐个单词前移光标的表达式和一个统计跳转次数的表达式。返回定义长度的函数 可以按同样思路设计:一个表达式逐个定义前移光标,另一个表达式构造长度列表。

这样梳理后,函数定义就十分简单了。显然,我们需要从文件开头开始统计,因此第一条命令是 (goto-char (point-min))。接着启动 while 循环;循环的条件测试可以是 正则表达式搜索下一个函数定义 — 只要搜索成功,光标就前移,然后执行循环体。循环体需要 一个构造长度列表的表达式。列表构造函数 cons 可以用来创建列表。几乎就是全部了。

代码片段如下:

(goto-char (point-min))
(while (re-search-forward "^(defun" nil t)
  (setq lengths-list
        (cons (count-words-in-defun) lengths-list)))

我们尚未实现的是查找包含函数定义的文件的机制。

在之前的示例中,我们要么使用当前 Info 文件,要么在其他缓冲区(如 *scratch*)间切换。

查找文件是我们尚未讨论的新操作。