Wie durchlaufe ich ein Verzeichnis in Common Lisp?
Ich bin mit OpenMCL auf Darwin, und ich würde gerne etwas machen wie:
(loop for f in (directory "somedir")
collect (some-per-file-processing f))
Aber ich kann Sie nicht directory
Rückkehr alles andere als NIL
und ich kann nicht scheinen zu finden, eine gute Erklärung online (anderes als "sein für jedes system anders").
Irgendwelche Hinweise?
InformationsquelleAutor der Frage Justicle | 2009-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Macht Ihr pathname Spezifikation enthalten eine wildcard? Common Lisp ist Pfadnamen Zeug ist etwas schwer zu fassen ist zunächst - zumindest für mich war es... Wie die CLHS Staaten auf der
directory
Funktion:Damit Ihre Pfadnamen enthalten eine wildcard, die Sie könnten versuchen, die make-pathname-Funktion, wie
Oder sogar
Fand ich die CL-FAD Bibliothek eine große Hilfe für den Umgang mit Pfadnamen und das Datei-system. Insbesondere seine
list-Verzeichnis
Funktion könnte einfacher zu bedienen als die einfachen standard -directory
Funktion.InformationsquelleAutor der Antwort Dirk
Gibt es grundsätzlich zwei Möglichkeiten zur Angabe von Pfadnamen:
Saiten sind natürlich abhängig von der Plattform: Unix-syntax vs. Windows-syntax, zum Beispiel.
Können Sie erstellen ein Pfad-Objekt aus einem string:
#P oben stellt sicher, dass ein Pfadname Objekt (und kein string) erstellt wird, wenn Sie es Lesen zurück.
So, intern Common Lisp arbeitet mit Pfadnamen Objekte, aber es ermöglicht Ihnen die Verwendung von normalen Saiten und macht Pfadname Objekte aus Ihnen, wenn nötig.
Wenn Common Lisp sieht ein Pfadname, der nicht alle Komponenten mit angegeben (zum Beispiel das Verzeichnis fehlt), dann füllt er die Komponenten von Pfadnamen-Objekt, das der Wert der variabel *STANDARD-PFADNAME-DEFAULTS* .
Mit der Funktion BESCHREIBEN, kann man sich die Komponenten eines Pfades (hier Clozure CL):
MAKE-PFADNAME ist der Funktion und es dauert ein paar keyword-Argumente zu den Komponenten.
Manchmal ist es auch nützlich, um einen neuen Pfadnamen auf der Basis von vorhandenen:
Wenn Sie-VERZEICHNIS ist es sinnvoll, einen Pfad mit wildcards. VERZEICHNIS wird dann zurück eine Liste der gefundenen Pfadnamen. Der name 'VERZEICHNIS' ist etwas irreführend, da VERZEICHNIS nicht auflisten des Inhalts eines Verzeichnisses, sondern listet die passenden Pfade für (in der Regel) eines Pfades mit Platzhaltern. Die wildcards kann eine Folge von Zeichen-Komponenten, wie /foo/s*c/Liste*.l*". Es gibt auch die wild-Karte ** , die werden verwendet, um Teile einer directory-Hierarchie wie /foo/**/test.lisp , die entspricht, Sie alle Dateien testen.lisp unter dem Verzeichnis " foo " und seinen Unterverzeichnissen.
Oben zurückkehren sollte, eine Liste mit allen 'lisp' - Dateien in '/Users/foo/Lisp/' und seinen Unterverzeichnissen.
Zurückgeben .c-Dateien in einem einzigen Verzeichnis zu verwenden:
Beachten Sie, dass die VERZEICHNIS gibt eine Liste von Pfadnamen Objekte (nicht eine Liste von strings).
Oben verwendet einen Pfadnamen Objekt, das erstellt wird, durch MAKE-PFADNAMEN. Es gibt alle Dateien mit /Lisp/cl-http/cl-http-342/server/md5.* .
Dies ist das gleiche wie:
was kürzer ist, sondern hängt von der Unix-Pfadname syntax.
InformationsquelleAutor der Antwort Rainer Joswig
Den modernen Common Lisp-Bibliothek Implementierung der Verzeichnis-Auflistung ist IOLIB.
Funktioniert es so:
Beachten Sie, dass kein nachgestellter Schrägstrich oder Platzhalter sind erforderlich. Es ist sehr robust und können auch Dateinamen mit falsch codierte unicode-Zeichen.
Unterschiede im Vergleich zu CL-FAD:
InformationsquelleAutor der Antwort David Lichteblau
Füge ich ein Beispiel, das funktioniert für mich, für das Interesse der ein code-snippet. Ich benutze osicat (ähnlich cl-fad) und str.
Bearbeiten: auch mit
uiop:directory-files
. str:enthält? könnte das mitsearch
.gibt
Es kann sicherlich verbessert werden, meine eine ordnungsgemäße Verwendung von wildcards. Aber das ist ein snippet, das Sie verwenden können, jetzt : )
Referenzen:
InformationsquelleAutor der Antwort Ehvince