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

て烟熏妆下的殇ゞ 提交于 2019-12-02 17:27:04
seh

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.

devstopfix

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.

Just a note that for anyone who wants to only read a single line, there's the read-line function.

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))
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!