2016-07-19 1 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)宣言されていない変数(countなど)は使用しないでください。コードを大まかに変更してください。 2)カウントに値が割り当てられていないとき、初めて( '> count 1 ')とは何でしょうか? 3) '(setq count(+ count 1))'ではなく 'incf'を使いたいでしょう。 4)エラーメッセージなどを表示していません。 「あなたのカウント変数が増分されていない」と考えているのはなぜですか?私のように、他のいくつかのエラーがあるように思えるかもしれません。おそらく(あなたのコードを実行しようとする前でも)いくつかのコンパイラ警告もあります。 –

+0

として何ですか?私はあなたのコメントは何かが欠けていると思う –

+0

私は変数の数を初期化していたことについて申し訳ありません:(setq count 0)私は何らかの理由で私のファイルの最初の行を読み取っているかもしれないと思われる。 – plzHelp

答えて

1

ループを実装した方法では、*lib*には1つの本しか追加されません。代わりにカウンターをチェックする

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

、私はその小さな機能を追加します推測:countが1を超える場合、あなたが明示的に最初の本エントリが入力ファイルから読み込まれたすなわち後、ループを終了しているためです唯一の目的は、ストリームから1つの書籍エントリを読み取ることであり、その機能は、入力が残っていないときに呼び出し元に指示する。 (またはnilの値を持つbook-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)) 
関連する問題