2009-08-21 17 views
8

LispでEOFまで入力ストリームを読み込むにはどうすればよいですか?私は事前にデータのサイズを指定しなくても、私のLispプログラムにパイプデータにできるようにしたいと思いますLispでEOFまでの入力を読み取る方法

while ((c = getchar()) != EOF) 
{ 
    // Loop body... 
}  

:Cでは、あなたはこのようにそれを行う可能性があります。ここで私が今やっている何かからの例です:このループで

(dotimes (i *n*) 
    (setf *t* (parse-integer (read-line) :junk-allowed T)) 
    (if (= (mod *t* *k*) 0) (incf *count*))) 

、変数*n*は私が(値が入力の最初の行から読み込まれる)プログラムにパイピングだ行数を指定し、ストリームの終わりに達すると停止する、任意の数の不明な行を処理するだけです。

答えて

9

read-lineは、NIL(デフォルト)またはEOFを打つ、代わりにエラーを知らせる上でユーザが指定した値(eof-value)のいずれかを返すことができるようにオプションの引数(eof-error-p)をとります。 Chapter 19 of Successful Lispから

READ-LINE &任意ストリームEOFエラー-P EOF値再帰-P上記読み出し機能で

、オプションの引数EOF-ERROR-PEOF-VALUE何を指定しますあなたのプログラムが使い尽くされたストリームからの読み込みを試みると起こります。 EOF-ERROR-Pが真(デフォルト)の場合、疲れたストリームを読み込もうとするとLispはエラーを通知します。 EOF-ERROR-PがNILの場合、Lispはエラーを通知する代わりにEOF-VALUE(デフォルトはNIL)を返します。

これは、関数の単純な終了条件として使用できます。

+1

あなたが何を意味するかわからない@GustavBertramとREAD-LINE

(loop for line = (read-line stream nil :eof) ; stream, no error, :eof value until (eq line :eof) do ...) 

または時々のためHyperSpecを参照してください。私はこの回答で7年以上前に投稿したリンクからダウンロードすることができます。私はただ確認した。 –

13

はnilに

(loop for line = (read-line stream nil nil) 
     while line 
     do ...) 
関連する問題