14.1 如何计数?

当我们首次考虑如何计算函数定义中的单词时,第一个问题是(或者应该是)我们要计数什么?当我们谈到与 Lisp 函数定义相关的“单词”时,实际上在很大程度上我们是在谈论符号。例如,下面的 multiply-by-seven 函数包含五个符号:defunmultiply-by-sevennumber*7。此外,在文档字符串中,它包含四个单词:‘Multiply’、‘NUMBER’、‘by’ 和 ‘seven’。符号 ‘number’ 被重复使用,因此定义包含总共十个单词和符号。

(defun multiply-by-seven (number)
  "Multiply NUMBER by seven."
  (* 7 number))

然而,如果我们使用 C-M-hmark-defun)标记 multiply-by-seven 定义,然后调用 count-words-example,我们会发现 count-words-example 声称该定义有十一个单词,而不是十个!有些地方出错了!

问题有两个方面:count-words-example 不将 ‘*’ 视为一个单词,而将单个符号 multiply-by-seven 视为包含三个单词。连字符被视为单词间的空格而不是单词内的连接符:‘multiply-by-seven’ 被计算为如果它被写成 ‘multiply by seven’。

混淆的原因在于 count-words-example 定义中的正则表达式搜索,该搜索按单词向前移动点。在 count-words-example 的典型版本中,正则表达式为:

"\\w+\\W*"

该正则表达式是一个模式,定义了一个或多个单词构成字符,后面可能跟着一个或多个不是单词构成字符的字符。关于“单词构成字符”是什么,这就引出了语法问题,值得单独讨论一节。