コメント応答

Plus さんいつもありがとう〜。

> or は CONDITIONS を順に評価して non-nil の値が出た時点でその値を返します。
> なので (or "." "..") は必ず "." になりますから、
> "." と ".." の両方を検査するのであれば間違いです。

ですよね。読んでいる Intro が古いのかな?
にしても (substring foo -1) の「-1」している時点で,
けつ1文字しか見てないですもんね。

> my-files-in-below-directory に関して、
> 今回は幾つか「こうした方がいいんじゃないか」という項目を出させてもらいますので
> よろしければ修正案を考えて下さい。

うい。よろこんで〜。

> [1]"." と ".." の場合を除外して処理してますが、
> directory-files の第3引数 MATCH を使用することで
> 戻り値から "." と ".." 自体を除外することができます。

はい,これドキュメントに載ってたので,既に試していたりします。

> [2](while l 〜 (car l) 〜 (setq l (cdr l))) は (dolist (x l) 〜 x) に
> 変更すると見やすくなります。

確かにそうですね。ただ,たぶん,while と cdr 使って,
リストを駆け巡るのに慣れるためにかなぁ,なんて思ってやっております。
けど,そろそろ慣れてきたので,今度は,dolist にも慣れようとも
思っちょります。

> [3]ファイル名の拡張子を返す関数として file-name-extension があります。

む。これはよさげですね。知らなかったです。

(defun my-files-in-below-directory (directory)
  ""
  (interactive "DDirectory name: ")
  (let ((el-files-list '())
        (current-dir-list (directory-files directory t "[^/][^.]+$")))
    (dolist (entry current-dir-list)
      (if (not (file-directory-p entry))
          ; This is a file.
          ;(when (equal "el" (file-name-extension entry))
          (when (equal ".el" (substring entry -3))
            (setq el-files-list (cons entry el-files-list)))
        ; This is a directory.
        (setq el-files-list (append (my-files-in-below-directory entry)
                                    el-files-list))))
    el-files-list))

こんな感じになったんですが,file-name-extension は,バージョン番号を取り除いて,
その拡張子を返すので,foo.el, foo.el.~1~, foo.el.~2~ があったとき,
それぞれ el を返してきちゃうので,期待した動作をしません。


だもんで,directory-files の正規表現で防ぐか,リストに追加するときに,
重複チェックするか,もしくはそれ以外の方法,で何かする必要があるので,
まず,正規表現でチェックしようとしたけど,ギブアップ。
んで,それなら,file-name-extension を使用しないで,
substring 使った方がいいかなぁと思った日曜日の午後。