2016-07-19 51 views
-2

我正在寫一個程序,從文件中讀取信息,但是當我嘗試讀取由於某種原因,我的計數變量沒有被增加的信息。變量沒有被遞增口齒不清環

(defun fill-lib() 
    (with-open-file (s-stream "/Users/David/Desktop/CS/CS_408/LISP/Books.txt" 
          :direction :input) 
     (loop 
     (cond((> count 1) (return "Library filled"))) 
      (setf (aref *lib* count) 
       (make-instance 'book :title (read s-stream) 
        :author (read s-stream) 
        :genre (read s-stream))) 
      (setq count (+ count 1))))) 

我有一種感覺,因爲我沒有正確使用循環,但我不完全確定我該如何解決這個問題。

+0

1)不要使用未聲明的變量(如計數)。 2)什麼是'(> count 1)'第一次應該做什麼,當沒有值分配計數? 3)你可能想'incf'而不是'(setq count(+ count 1))'。 4)你沒有顯示任何錯誤信息或類似的東西。是什麼讓你認爲「你的計數變量沒有增加」?在我看來,你會得到一些其他的錯誤,並且可能還有一些編譯器警告(甚至在你嘗試運行你的代碼之前)。 –

+0

作爲什麼?我認爲你的評論是缺少的東西 –

+0

對不起,我有變量計數初始化爲:(setq計數0)我開始懷疑我可能只是由於某種原因閱讀我的文件的第一行。 – plzHelp

回答

1

你已經實現了循環的方式,只有一本書都不會被添加到*lib*。這是因爲你被明確終止循環的時候count超過1,第一本書的條目已經從輸入文件讀取之後即:

(cond((> count 1) (return "Library filled"))) 

而不是檢查計數器的,我想我會添加一個小功能,其唯一的目的是從流中讀取一個書本條目,並且該功能將在沒有輸入時向調用者指示。 (或者你可以從一個nilbook-title當檢測到循環退出。最好的方法取決於輸入數據的結構,以及對穩健性水平你是之後,當然)。

這裏是你的代碼的一個粗略的變化,使用添加功能的方法這是專門爲讀取來自輸入單簿條目:

(defstruct book 
    (title nil) 
    (author nil) 
    (genre nil)) 

(defun read-book(s) 
    (make-book :title (read-line s nil :eof) 
      :author (read-line s nil :eof) 
      :genre (read-line s nil :eof))) 

(defun fill-lib() 
    (let ((lib())) 
    (with-open-file (s "/tmp/Books.txt" :direction :input) 
     (loop for book = (read-book s) 
      until (eq (book-title book) :eof) do 
      (push book lib))) 
    lib)) 

(print (fill-lib))