I am writing my first clojure program, and want to read lines from stdin.
When I try this:
(doall (map #(println %) (line-seq *in*)))
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.
You should probably use doseq instead of doall:
(doseq [line (line-seq (java.io.BufferedReader. *in*))]
(println line))
doall:
Walks through the successive nexts of the seq, retains the head and returns it, thus causing the entire seq to reside in memory at one time.
doseq:
Does not retain the head of the sequence. Returns nil.
For reasonably small inputs, the following would also work:
(let [input-string (slurp *in*)]
(println input-string))
Or, splitting by lines:
(let [lines (clojure.string/split-lines (slurp *in*))]
(println lines))
Just a note that for anyone who wants to only read a single line, there's the read-line function.