GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/eintr/Words-and-Symbols.html ・ emacs-doc.conao3.com

14.1 何をカウントするか?

関数定義における「単語」をどう数えるかを考え始める際、まず問われるのは(あるいは問われるべきなのは)、一体何を数えるのかということです。Lispの関数定義に関して「単語」と言うとき、実際にはその大部分はシンボルのことを指しています。例えば、以下の multiply-by-seven 関数には、defun、multiply-by-seven、number、*、7 という5つのシンボルが含まれています。さらに、ドキュメント文字列には、Multiply、NUMBER、by、seven という4つの単語が含まれています。シンボル number は重複して出現しているため、この定義には合計で10個の単語とシンボルが含まれていることになります。

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

しかし、multiply-by-seven の定義に C-M-h (mark-defun) をマークし、その上で count-words-example を呼び出すと、count-words-example がその定義には10語ではなく11語あると主張していることがわかります!何かがおかしいです!

問題は2点ある。count-words-example は ‘*’ を単語としてカウントせず、単一の記号 multiply-by-seven を3つの単語を含むものとしてカウントする。ハイフンは単語内の連結要素ではなく、単語間のスペースであるかのように扱われる。‘multiply-by-seven’ は、あたかも ‘multiply by seven’ と書かれているかのようにカウントされる。

この混乱の原因は、count-words-example の定義内にある、ポイントを単語単位で進める正規表現検索にあります。count-words-example の正準版における正規表現は以下の通りです:

"\\w+\\W*"

この正規表現は、1つ以上の単語構成文字と、その後に続く可能性のある1つ以上の非単語構成文字を定義するパターンです。「単語構成文字」が何を意味するのかという点は構文の問題へとつながりますが、これについては別途一節を割く価値があります。