我正在编写我的第一个clojure程序,并希望从stdin读取行.
当我尝试这个:
(doall (map #(println %) (line-seq *in*)))
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
Exception in thread "main" java.lang.ClassCastException: clojure.lang.LineNumberingPushbackReader cannot be cast to java.io.BufferedReader (test.clj:0)
Run Code Online (Sandbox Code Playgroud)
我在版本1.0和1.1中得到了相同的结果
那么如何转换*in*为seq我可以迭代?我会认为这很常见,*in*本身可以迭代,但这也不起作用 - 如果我尝试直接使用它,我得到:
java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.LineNumberingPushbackReader (NO_SOURCE_FILE:0)
Run Code Online (Sandbox Code Playgroud)
另外,有没有在clojure中进行常规文件处理的例子?
seh*_*seh 29
尝试包裹*in*的java.io.BufferedReader.并且还使用devstopfix指出doseq代替doall:
(doseq [ln (line-seq (java.io.BufferedReader. *in*))]
(println ln))
Run Code Online (Sandbox Code Playgroud)
请注意,line-seq记录为要求其BufferedReader作为其来源.
对于相当小的输入,以下也适用:
(let [input-string (slurp *in*)]
(println input-string))
Run Code Online (Sandbox Code Playgroud)
或者,按行拆分:
(let [lines (clojure.string/split-lines (slurp *in*))]
(println lines))
Run Code Online (Sandbox Code Playgroud)