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

14.8 異なるファイル内の単語を再帰的にカウントする

while ループ以外にも、再帰を用いてファイルリストの各ファイルを処理できます。lengths-list-many-files の再帰版は簡潔でシンプルです。

再帰関数は、do-again-test、next-step-expression、そして再帰呼び出しという、一般的な構成要素で成り立っています。do-again-testは、関数が自身を再度呼び出すべきかどうかを判定し、list-of-filesに残りの要素があれば呼び出しを行います。next-step-expressionはlist-of-filesを自身のCDRにリセットするため、最終的にリストは空になります。そして再帰呼び出しは、より短いリストに対して自身を呼び出します。関数全体は、この説明よりも短くなっています!

(defun recursive-lengths-list-many-files (list-of-files)
  "Return list of lengths of each defun in LIST-OF-FILES."
  (if list-of-files                     ; do-again-test
      (append
       (lengths-list-file
        (expand-file-name (car list-of-files)))
       (recursive-lengths-list-many-files
        (cdr list-of-files)))))

1文で説明すると、この関数は、残りのlist-of-filesに対して自身を呼び出した結果にlist-of-filesを付加した最初の要素のlengths’リストを返します。

以下にrecursive-lengths-list-many-filesのテストと、各ファイルに対して個別にlengths-list-fileを実行した結果を示します。

必要に応じて recursive-lengths-list-many-files と lengths-list-file をインストールし、以下の式を評価してください。ファイルのパス名を変更する必要がある場合があります。ここに記載のパスは、この Info ファイルと Emacs のソースコードが通常の場所に配置されている場合に有効です。式を変更するには、それらを *scratch* バッファにコピーして編集し、その後評価してください。

結果は ‘⇒’ の後に表示されます。(これらの結果は Emacs バージョン 22.1.1 のファイルを対象としたものであり、他のバージョンの Emacs のファイルでは異なる結果になる場合があります。)

(cd "/usr/local/share/emacs/22.1.1/")

(lengths-list-file "./lisp/macros.el")
     ⇒ (283 263 480 90)

(lengths-list-file "./lisp/mail/mailalias.el")
     ⇒ (38 32 29 95 178 180 321 218 324)

(lengths-list-file "./lisp/hex-util.el")
     ⇒ (82 71)

  (recursive-lengths-list-many-files
   '("./lisp/macros.el"
     "./lisp/mail/mailalias.el"
     "./lisp/hex-util.el"))
       ⇒ (283 263 480 90 38 32 29 95 178 180 321 218 324 82 71)

recursive-lengths-list-many-files関数は、期待通りの出力を生成します。

次のステップは、リスト内のデータをグラフに表示できるように準備することです。