9

LispでEOFまで入力ストリームを読み取るにはどうすればよいですか? C では、次のようにします。

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

データ サイズを事前に指定しなくても、データを Lisp プログラムにパイプできるようにしたいと考えています。これが私が今やっているものの例です:

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

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

4

2 に答える 2

15

READ-LINEの HyperSpec を参照してください

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

または時にはnilで

(loop for line = (read-line stream nil nil)
      while line
      do ... )
于 2009-08-21T09:54:04.633 に答える
11

read-lineはオプションの引数 ( ) を取り、エラーを通知する代わりに(デフォルト) またはユーザー指定の値 ( ) をヒット時eof-error-pに返すことができます。NILeof-valueEOF

成功した Lisp の第 19 章から:

READ-LINE &optional stream eof-error-p eof-value recursive-p

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

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

于 2009-08-21T09:05:15.870 に答える