pau*_*doo 6 io clojure lazy-evaluation
我正在使用文本文件读取行(line-seq (reader "input.txt"))
.然后这个集合传递给我的程序使用.
我担心这可能是糟糕的风格,因为我没有确定性地关闭文件.我想我无法使用(with-open (line-seq (reader "input.txt")))
,因为在我遍历整个序列之前,文件流可能会被关闭.
应该lazy-seq
与reader
文件一起避免吗?我应该在这里使用不同的模式吗?
Sea*_*eld 15
由于这并没有真正有一个明确的答案(它在第一个答案的评论中都是混合的),这是它的本质:
(with-open [r (reader "input.txt")]
(doall (line-seq r)))
Run Code Online (Sandbox Code Playgroud)
这将强制读取整个行序列并关闭文件.然后,您可以传递整个表达式的结果.
处理大型文件时,您可能会遇到内存问题(将整个行序列保存在内存中),这是反转程序时的好主意:
(with-open [r (reader "input.txt")]
(doall (my-program (line-seq r))))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可能需要也可能不需要doall,具体取决于我的程序返回的内容和/或我的程序是否懒惰地消耗序列.