Comment puis-je parcourir un répertoire dans le répertoire Common Lisp?
Je suis en utilisant OpenMCL sur Darwin, et j'aimerais faire quelque chose comme:
(loop for f in (directory "somedir")
collect (some-per-file-processing f))
Mais je ne peux pas obtenir directory
pour revenir à autre chose que de NIL
, et je n'arrive pas à trouver une bonne explication en ligne (autre que "son différent pour chaque système").
Les pointeurs?
Vous devez vous connecter pour publier un commentaire.
Votre chemin spécification contenir un caractère générique? Common Lisp du chemin des choses est quelque peu difficile à saisir au premier abord - au moins pour moi, c'était... Comme le CLHS états sur la
directory
fonction:Afin d'avoir votre nom de chemin d'inclure un caractère générique, vous pouvez essayer de le faire-chemin de fonction, comme
Ou même
J'ai trouvé le CL-FAD bibliothèque d'une grande aide pour traiter avec les chemins d'accès et le système de fichiers. En particulier, son
liste-annuaire
fonction pourrait être plus facile à utiliser que la plaine standarddirectory
fonction.Il y a fondamentalement deux manières de spécifier les chemins d'accès:
Chaînes sont évidemment selon la plate-forme: syntaxe Unix vs syntaxe Windows par exemple.
Vous pouvez créer un chemin d'accès d'objet à partir d'une chaîne:
La #p ci-dessus assure qu'un chemin d'accès de l'objet (et non une chaîne de caractères) est créé lorsque vous lisez de nouveau.
Donc, en interne Common Lisp fonctionne avec chemin d'accès des objets, mais il vous permet d'utiliser des chaînes et rend le chemin d'accès des objets à partir d'eux, si nécessaire.
Lors de la Common Lisp voit un chemin qui n'a pas tous les composants (par exemple, le répertoire est manquant), puis il remplit les composants à partir du chemin d'accès de l'objet qui est la valeur de la variabel *par DÉFAUT-CHEMIN par DÉFAUT* .
Avec la fonction de DÉCRIRE, vous pouvez regarder les composants d'un nom de chemin (ici Clozure CL):
FAIRE-PATHNAME est la fonction qui prend un peu de mot-clé arguments pour spécifier les composants.
Parfois, il est également utile de créer un nouveau chemin d'accès basé sur un existant:
Si vous utilisez le RÉPERTOIRE, il est utile d'utiliser un chemin d'accès avec des caractères génériques. RÉPERTOIRE puis retournera une liste de correspondance des chemins d'accès. Le nom de "RÉPERTOIRE" est un peu trompeur, car le RÉPERTOIRE de ne pas lister le contenu d'un répertoire, mais la liste de la correspondance des noms de chemins de (généralement) un chemin avec des caractères génériques. Les caractères génériques peuvent correspondre à des séquences de caractères dans les composants tels que /foo/s*c/liste*.l*". Il y a aussi le joker ** , qui est utilisé pour faire correspondre les pièces du répertoire de la hiérarchie comme /foo/**/test.lisp , qui correspond à tous les fichiers de test.lisp sous le répertoire foo et ses sous-répertoires.
Ci-dessus doit renvoyer une liste de tous les "lisp" les fichiers dans/Utilisateurs/foo/Lisp/' et tous ses sous-répertoires.
Pour revenir la .c fichiers dans un répertoire unique utilisation:
Noter que le RÉPERTOIRE retourne une liste de nom de chemin d'objets (et pas une liste de chaînes de caractères).
Ci-dessus utilise un chemin d'accès de l'objet qui est créé par la MAKE-CHEMIN. Elle retourne tous les fichiers qui correspondent à /Lisp/cl-http/cl-http-342/serveur/md5.* .
C'est la même chose que:
qui est plus court, mais dépend de l'Unix de la syntaxe.
Modernes Common Lisp de la bibliothèque de la mise en œuvre de répertoire la liste est IOLIB.
Il fonctionne comme ceci:
Noter qu'aucune barre oblique ou des caractères génériques sont nécessaires. Il est très robuste et peut même processus noms de fichiers avec mal des caractères unicode codés.
Différences par rapport à CL-FAD:
Je vais ajouter un exemple qui fonctionne pour moi, pour l'amour d'un extrait de code. J'utilise osicat (similaire à cl-fad) et str.
modifier: aussi avec
uiop:directory-files
. str:contient? pourrait être fait avecsearch
.retourne
Il peut certainement être amélioré mon une bonne utilisation de caractères génériques. Cependant, c'est un fragment de code que vous pouvez utiliser dès maintenant : )
Références: