Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read lines from stdin (*in*) in clojure

Tags:

stdin

clojure

I am writing my first clojure program, and want to read lines from stdin.

When I try this:

(doall (map #(println %) (line-seq *in*))) 

I get this exception:

Exception in thread "main" java.lang.ClassCastException: clojure.lang.LineNumberingPushbackReader cannot be cast to java.io.BufferedReader (test.clj:0) 

I get the same results in version 1.0 and 1.1

So how do I convert *in* into a seq I can iterate over? I would have thought that this is common enough that *in* itself would be iterable, but that does not work either - if I try to use it directly I get:

java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.LineNumberingPushbackReader (NO_SOURCE_FILE:0) 

Also, are there any examples of doing general file handling in clojure?

like image 553
Dave Kirby Avatar asked Jan 09 '10 16:01

Dave Kirby


1 Answers

Try wrapping *in* in a java.io.BufferedReader. And also use doseq instead of doall, as devstopfix pointed out:

(doseq [ln (line-seq (java.io.BufferedReader. *in*))]    (println ln)) 

Note that line-seq is documented to require a BufferedReader as its source.

like image 101
seh Avatar answered Sep 19 '22 21:09

seh