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

后端 未结 4 1978
情歌与酒
情歌与酒 2020-12-13 13:09

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

When I try this:

(doall (map #(println %) (line-seq *in*)))
相关标签:
4条回答
  • 2020-12-13 13:29

    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.

    0 讨论(0)
  • 2020-12-13 13:29

    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.

    0 讨论(0)
  • 2020-12-13 13:31

    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))
    
    0 讨论(0)
  • 2020-12-13 13:42

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

    0 讨论(0)
提交回复
热议问题