2017-06-09 4 views
0

Ich muss aus einer Datei lesen, aber ich habe einige Probleme mit dem Code. Ich habe ich wie diese Datei zu lesen:Aus der Datei lesen Common Lisp

1.0 4.5 
4.555 6.43 
4.0 5 
..... 
6 3 

2 Nummern pro von #\Space oder #\Tab getrennt Leitung (in der Datei kann ich eine große Anzahl von Zeilen hat). Die Funktion Lese muss eine Liste wie folgt zurück:

((1.0 4.5)(4.555 6.43)(4.0 5)...(6 3)) 

Ich habe versucht mit with-open-file, read-line und Rekursion, aber ich habe Probleme Ströme usw. Umgang derjenigediejenigedasjenige Elemente in der Liste in der richtigen Weise zu setzen

(with-open-file (in "foo.lisp" 
      :direction :input 
      :if-does-not-exist :error) 
(myread in)) 

(defun myread (filename) 
(let ((e (read-line filename nil ’eof)))) 

??? 

(cons (;;;numbers of current line;;;)(myread (filename))) 

Wie kann ich das tun?

dank

Antwort

1

Die üblichen Idiom ist

(defun read-file-as-lines (filename) 
    "Read file into a list of lines." 
    (with-open-file (in filename) 
    (loop for line = (read-line in nil nil) 
     while line 
     collect line))) 

(defun line-as-list (line) 
    "Read all objects from the line as a list." 
    (read-from-string (concatenate 'string "(" line ")"))) 

(mapcar #'line-as-list (read-file-as-lines "mydata")) 

Wenn Sie mit Memory-Nutzung betroffen sind, Sie map-into statt mapcar oder sogar passieren line-as-list als Argument an read-file-as-lines verwenden können.

Pflichlecktüre:

Übung: Verwenden Sie loop in line-as-list anstatt Klammern vorangestellt und angehängt. Auf diese Weise können Sie steuern, wie viele Objekte Sie lesen und Kommentare bearbeiten & c.

Lösung: string-tokens.