defuns をカウントする
¶simple.elのようなファイルには、100件以上の関数定義が含まれている場合があります。長期的な目標は多くのファイルに関する統計を収集することですが、まずは第一歩として、単一のファイルに関する統計を収集することを当面の目標としています。
情報は一連の数値で構成され、各数値は関数定義の長さを表します。これらの数値はリストに格納できます。
1つのファイルに関する情報を、他の多くのファイルに関する情報と統合したい場合があることは分かっています。つまり、1つのファイル内の定義長をカウントする関数は、単に長さのリストを返せばよいということです。メッセージを表示する必要はなく、また表示すべきではありません。
単語数カウントコマンドには、ポインタを単語単位で前方にジャンプさせる式と、ジャンプ回数をカウントする式の2つが含まれています。定義の長さを返す関数も同様に設計でき、一方の式でポインタを定義単位で前方にジャンプさせ、もう一方の式で長さのリストを構築します。
この問題設定により、関数定義を記述する作業は極めて単純になります。当然ながら、カウントはファイルの先頭から開始するため、最初のコマンドは (goto-char (point-min)) となります。次に while
ループを開始します。このループの真偽判定は、次の関数定義を正規表現で検索することで行えます――検索が成功すればポインタが前進し、その後ループ本体が評価されます。本体には、lengths
リストを構築する式が必要です。リスト構築コマンドである cons
を使用して、このリストを作成できます。基本的には、以上でほぼすべてです。
このコード断片は以下のようになっています。
(goto-char (point-min))
(while (re-search-forward "^(defun" nil t)
(setq lengths-list
(cons (count-words-in-defun) lengths-list)))
抜け落ちているのは、関数定義を含むファイルを探し出す仕組みです。
これまでの例では、これかInfoファイルを使用するか、あるいは*scratch*バッファなどの別のバッファと交互に切り替えて使用してきました。
ファイルの検索は、まだ取り上げていない新しい処理です。