Wie kann ich den Inhalt einer Datei in eine Liste in Lisp?
Ich Lesen möchte in den Inhalt einer Datei in einer Liste. Einige meiner versuche bisher -
(defun get-file (filename)
(let ((x (open filename)))
(when x
(loop for line = (read-line x nil)
while line do (list line)))
(close x)))
(defun get-file (filename)
(let ((x (open filename :if-does-not-exist nil)) (contents (list nil)))
(when x
(loop for line = (read-line x nil)
while line do (cons contents line)))
(close x) contents))
(defun get-file (filename)
(let ((x (open filename :if-does-not-exist nil)) (contents nil))
(when x
(loop for line = (read-line x nil)
while line do (append contents line)))
(close x) contents))
Keines dieser arbeitete. Kann mir jemand sagen, einen Weg? Oder noch besser - wie, um all die Inhalte in ein array?
InformationsquelleAutor Sterling | 2010-09-28
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie etwa
with-open-file
öffnet die Datei namensfilename
und Mitarbeiter der stream mitf
.collecting
sammelt die verschiedenen Werte vonline
in einer Liste, bis diewhile
istnil
. Die Common Lisp HyperSpec und Praktischen Common Lisp sind deine Freunde!with-open-file
macht die ganze Arbeit deropen
undclose
und dielet
.Wo sind die Probleme?
TUN wird, führen nur etwas für Nebenwirkungen.
SAMMELN, sammelt das Ergebnis und die SCHLEIFE gibt eine Liste der erhobenen Werte auf die Ausfahrt.
Wie bereits erwähnt, verwenden MIT-OFFENEN-DATEI anstelle der OPEN/CLOSE. MIT-OFFENEN-DATEI wird die Datei schließen beim verlassen der dynamische Umfang. Nicht nur von einer normalen Ausfahrt, aber auch bei der Fehler-Bedingungen mit UNWIND-PROTECT.
Wenn Sie möchten, Lesen Sie den Inhalt einer Datei, die Sie verwenden können, LESEN Sie-SEQUENZ. Mit den üblichen Probleme. Zum Beispiel, wenn Sie Lesen eine ASCII-Datei als text in einem string, wird der string kürzer sein kann als die Datei. Beispielsweise Common Lisp dar, intern CRLF mit einem einzigen Charakter, auf den Bahnsteigen, wo CRLF Zeilenumbruch. Ein anderes Beispiel: in Unicode-Implementierungen unterstützen den UTF-8 code in die Datei, die ersetzt werden kann mit einem einzigen Charakter.
Werde ich hinzufügen, Bibliotheken.
Bearbeiten noch einfacher, mit
uiop
, die enthalten ist in ASDF:https://github.com/fare/asdf/blob/master/uiop/stream.lisp#L445
hat auch
Mit Alexandria s
-Lesen-Datei-in-string
und split-sequence:Mit str: