9

我正在 Clojure 中编写一个Brainf***解释器。我想通过一个程序来使用标准输入。但是,我仍然需要稍后从标准输入读取用户输入。

目前,我正在这样做:

$ 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)(似乎非常低级)。

4

2 回答 2

12

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

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

如果您的文件可以放入可用内存,则此方法可以正常工作;要懒惰地阅读大文件,请参阅此答案

于 2013-12-30T04:13:27.350 回答
10

you could get a lazy seq of lines from *in* like this:

(take-while identity (repeatedly #(.readLine *in*)))

or this:

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

which are functionally identical.

于 2013-12-29T14:00:55.327 回答