当我们首次考虑如何计算函数定义中的单词时,第一个问题是(或者应该是)我们要计数什么?当我们谈到与 Lisp 函数定义相关的“单词”时,实际上在很大程度上我们是在谈论符号。例如,下面的 multiply-by-seven
函数包含五个符号:defun
、multiply-by-seven
、number
、*
和 7
。此外,在文档字符串中,它包含四个单词:‘Multiply’、‘NUMBER’、‘by’ 和 ‘seven’。符号 ‘number’ 被重复使用,因此定义包含总共十个单词和符号。
(defun multiply-by-seven (number) "Multiply NUMBER by seven." (* 7 number))
然而,如果我们使用 C-M-h(mark-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*"
该正则表达式是一个模式,定义了一个或多个单词构成字符,后面可能跟着一个或多个不是单词构成字符的字符。关于“单词构成字符”是什么,这就引出了语法问题,值得单独讨论一节。