如何在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

我在用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 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
中,如示例所示。的可能重复项