如何在Clojure中读取stdin中的所有行

时间:2013-12-29 13:12:32

标签: clojure stdin clojure-java-interop

我正在Clojure写一个Brainf***翻译。我想在使用stdin时传递一个程序。但是,我仍然需要稍后从stdin读取用户输入。

目前,我正在这样做:

$ cat sample_programs/hello_world.bf | lein trampoline run

我的Clojure代码只使用read-line

读取第一行
(defn -main
  "Read a BF program from stdin and evaluate it."
  []
  ;; FIXME: only reads the first line from stdin
  (eval-program (read-line)))

如何读取我用过的文件中的所有行? *in*似乎是java.io.Reader的一个实例,但只提供.read(一个字符),.readLine(一行)和read(char[] cbuf, int off, int len)(似乎非常低)电平)。

2 个答案:

答案 0 :(得分:10)

将所有输入数据作为单个字符串读取非常简单:

(defn -main []
  (let [in (slurp *in*)]
    (println in)))

如果您的文件可以放入可用内存,这可以正常工作;如果懒惰地阅读大文件,请参阅this answer

答案 1 :(得分:9)

你可以像*in*那样从(take-while identity (repeatedly #(.readLine *in*))) 获得一系列懒惰的行:

(line-seq (java.io.BufferedReader. *in*))

或者这个:

{{1}}

功能相同。