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関数は、期待通りの出力を生成します。
次のステップは、リスト内のデータをグラフに表示できるように準備することです。