2016-02-27 133 views
0

我想在文本文件中添加列表以將lisp綁定到某個變量。 例如 Mylist.txt包含: ((1 2 3 4) (5 6 7 8) (9 10 11 12) (13 14 15 16) ) ,我想從該文件的讀取和並將此列表設置爲某個變量mylist。如何將文件中的列表添加到Lisp中

(defun readfile (fileName) (let ((in (open fileName :if-does-not-exist nil))) 
    (when in 
     (loop for line = (read in nil) 

     while line do (print line)) 
     (close in) 
    ) 
    )) 


    (setf myList (readfile "list.txt")) 

輸出應(myList中應當限定於): ((1 2 3 4) (5 6 7 8) (9 10 11 12) (13 14 15 16) )

我已經看到了關於這個stackflow的大部分答案,但非他們工作,例如我試着逐行讀取它,並使用收集,但似乎沒有給我正確的答案,因爲它收集的整個行,並把它作爲項目清單。

+0

你能澄清你在做什麼嗎?你是否試圖從文件中讀取數據,並且你想要一個字符串?或者你想要一個列表?我以爲你想要一個清單,但最後一句話意味着你不需要清單。上面的代碼也不是逐行讀取,它讀取一個表達式。 – verdammelt

+0

抱歉模糊不清。我正在嘗試從文件中讀取LIST,假定該文件有沒有任何錯誤的列表。例如LIST.TXT文件應包含 ((R DR DL L) (DR L O,DL) (DR UR UR U) (R URÚG)) ,我想設定數組列表這個值或列表。如果您仍然對此有疑問,請告知我。就我的代碼而言,我知道我正在以字符串的形式讀取它,因爲我不知道如何讀取整個文件。 – Sagar0921

+1

如果您只想讀取文件中第一個文件的列表,只需調用'read'就可以完成這項工作。無需循環。您應該使用'with-open-file'而不是手動打開和關閉文件。 – jkiiski

回答

0

到目前爲止,您正在閱讀文件並將其打印到標準輸出((print line)中的READFILE聲明)。相反,你想收集輸入。

(defun read-file (file-name) 
    (let ((*read-eval* nil)) 
    (with-open-file (in file-name) 
    (loop for x = #1=(read-line in nil :eof) then #1# 
     until (eq x :eof) 
     collect (read-from-string x))))) 

行由行: 1.請使用CL約定的名稱。 2.在存在read macros時,從字符串/文件讀取是危險的。將*READ-EVAL*設置爲NIL可防止其執行。 3.我們需要做的閱讀很簡單。使用WITH-OPEN-FILE提供了一個簡單而安全的界面(例如,如果引發一個條件(例外),它將正確關閉文件)。 IN是與文件關聯的輸入流的名稱。 4.在LOOP每次迭代中讀取一行。在這裏我假定每一行都是一個合適的Lisp表達式(例如,一個數字或一個列表)。如果你有表達式跨越多行,這需要改變。 #1=讓你記住它的格式和#1#插入那個表格。這用於避免重複(READ-LINE ...)形式的初始和然後聲明。 READ-LINE被指示如果達到文件結束時不會拋出錯誤,而是返回:EOF。 5.直到達到文件結尾... 6.讀取(將字符串轉換爲Lisp數據)並收集從文件中讀取的行。

該函數返回文件的列表(讀入到Lisp數據中)。例如,如果 「的text.txt」 包含

((1 2 3) (4 5 6)) 
(a b c) 
(:f :g :h) 

的 「的test.txt」 的READ-FILE將導致:

CL-USER> (read-file "test.txt") 
(((1 2 3) (4 5 6)) (A B C) (:F :G :H)) 

最後,不要SETF除非MY-LIST定義使用使用DEFVARDEFPARAMETER (在這種情況下,它應該被命名爲*MY-LIST*),或者如果它是使用LET在本地定義的。

相關問題