2009-09-24 224 views
1

我想遍歷給定的目錄並創建一個以.jpg結尾的文件列表。遍歷目錄樹

(setq files (list)) 

(defun jpg-list(directory) 
    (dolist (node (directory-files directory t)) 
     (if (file-directory-p node)  
      (if (not 
      (string= (substring node (- (string-width node) 1)) ".")) 
      (jpg-list node)) 
    (if (string-match ".jpg" node) 
     (setq files (cons node files))))) 
    files) 

我想這樣做,而不使用外部變量(文件)。在elisp中做這件事的慣用方式是什麼?

回答

4

這裏是我的功能的解決方案:

(defun jpg-list (dir) 
    (if (file-directory-p dir) 
     (append 
     (directory-files dir t ".jpg$") 
     (apply 'append (mapcar 'jpg-list (directory-files dir t "[^.]+")))))) 
5

最好的辦法是使用'directory-files全接口,只需使用:

(directory-files directory t ".jpg$") 

更大的問題是如何避免頂層變量,它通常是由'let聲明,例如解決

(defun jpg-list (directory) 
    (let ((files)) 
    ...do something with files... 
    files)) 
+0

感謝,這解決了我的問題。但是對於不同的情況,編寫這種循環的習慣方式是什麼?使用setq遍佈各處似乎沒有功能代碼? – 2009-09-24 19:54:21

+0

如果你想要一個更「功能性」的方法,你可能想用lambda表示你的(目錄文件)mapcar,它遞歸地調用你的函數在subdirs上。 – aaron 2009-09-24 21:58:57

+1

對,mapcar功能更強大,但並沒有解決他的問題。你需要像'remove-if','remove'等''cl'中的例程,這完全取決於你在做什麼。慣用的方式是完全使用「目錄文件」。接下來的方法是通過「let」使用局部變量,你可以編寫一個遞歸例程,使用''cl'函數等等等等。注意:Emacs不起作用,它是充滿了各種各樣的副作用... – 2009-09-24 22:48:19