我正在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)
(似乎非常低)电平)。
答案 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}}
功能相同。