コメント応答
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 使った方がいいかなぁと思った日曜日の午後。