如何在Clojure中读取stdin中的所有行
我在用Clojure写翻译。我想用标准输入法通过一个程序。但是,我以后仍然需要从stdin中读取以供用户输入 目前,我正在这样做:如何在Clojure中读取stdin中的所有行,clojure,stdin,clojure-java-interop,Clojure,Stdin,Clojure Java Interop,我在用Clojure写翻译。我想用标准输入法通过一个程序。但是,我以后仍然需要从stdin中读取以供用户输入 目前,我正在这样做: $ cat sample_programs/hello_world.bf | lein trampoline run 我的Clojure代码只读取第一行,使用readline: (defn -main "Read a BF program from stdin and evaluate it." [] ;; FIXME: only reads the
$ cat sample_programs/hello_world.bf | lein trampoline run
我的Clojure代码只读取第一行,使用readline
:
(defn -main
"Read a BF program from stdin and evaluate it."
[]
;; FIXME: only reads the first line from stdin
(eval-program (read-line)))
我如何读取我输入的文件中的所有行<*中的code>*似乎是
java.io.Reader
的一个实例,但它只提供.read
(一个字符)、.readLine
(一行)和read(char[]cbuf,int off,int len)
(似乎级别很低)。您可以从*中的*中获得一个惰性的行序列,如下所示:
(take-while identity (repeatedly #(.readLine *in*)))
或者这个:
(line-seq (java.io.BufferedReader. *in*))
功能相同。将所有输入数据作为单个字符串读取非常简单:
(defn -main []
(let [in (slurp *in*)]
(println in)))
如果您的文件可以放在可用内存中,那么这种方法可以很好地工作;有关惰性地读取大文件的信息,请参见。line seq
正是这样做的,不是吗?是的。我会在答案中加上这个。后者似乎不起作用(line seq*in*)
提供了ClassCastException clojure.lang.LineNumberingPushbackReader不能强制转换为java.io.BufferedReader
。我错过了什么吗?@WilfredHughes是的,你错过了这样一个事实,即*
中的*需要包装在java.io.BufferedReader
中,如示例所示。的可能重复项