2009-09-24 6 views
1

J'essaie de parcourir un répertoire donné et de créer une liste de fichiers se terminant par .jpg.Traverser une arborescence de répertoires

(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) 

Je voudrais faire cela sans utiliser de variable externe (fichiers). Quelle est la manière idiomatique de le faire en elisp?

Répondre

4

Voici ma solution fonctionnelle:

(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

Votre meilleur pari est d'utiliser l'interface 'directory-files complète et il suffit d'utiliser:

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

La grande question était de savoir comment éviter la variable de haut niveau, qui est habituellement résolu par une déclaration 'let, par exemple

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

grâce, qui a résolu mon problème. Mais pour une situation différente, quelle est la manière idiomatique d'écrire ce genre de boucle? utilisant setq partout ne semble pas le code fonctionnel? –

+0

Si vous voulez une approche plus 'fonctionnelle' vous voudrez probablement faire une mapcar sur votre (répertoire-fichiers) avec un lambda où il appelle récursivement votre fonction sur des sous-répertoires. – aaron

+1

A droite, mapcar est plus fonctionnel, mais ne résout pas son problème. Vous auriez besoin de routines dans "cl" comme "remove-if", "remove", etc. Tout dépend de ce que vous faites. La manière idiomatique est d'utiliser '' directory-files' dans toute son étendue. La prochaine façon (avec un minimum de changement de code) est d'utiliser une variable locale via 'let', vous pouvez écrire une routine récursive, utiliser des fonctions '' cl', etc., etc. etc. Remarque: Emacs n'est pas fonctionnel, c'est plein de toutes sortes d'effets secondaires ... –

Questions connexes