Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read input until EOF in Lisp

How do I read an input stream until EOF in Lisp? In C, you might do it like this:

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

I would like to be able to pipe data to my Lisp programs without having to specify the data size in advance. Here's an example from something I'm doing now:

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

In this loop, the variable *n* specifies the number of lines I'm piping to the program (the value is read from the first line of input), but I would like to just process an arbitrary and unknown number of lines, stopping when it reaches the end of the stream.

like image 793
Fredrick Pennachi Avatar asked Aug 21 '09 08:08

Fredrick Pennachi


1 Answers

See the HyperSpec for READ-LINE

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

or sometimes with nil

(loop for line = (read-line stream nil nil)
      while line
      do ... )
like image 169
Rainer Joswig Avatar answered Nov 20 '22 12:11

Rainer Joswig