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* 缓冲区。

找到文件是我们尚未讨论的一个新过程。