假设我用with-open 和 clojure.java.io/reader编写了一个函数来解析 txt 文件中的数据,然后我编写了另一个函数来多次调用 reader 函数以处理数据,例如
(defn grabDataFromFile [file patternString]
(let [data (atom [])]
(with-open [rdr (clojure.java.io/reader file)]
(doseq [line (line-seq rdr)]
(if (re-matches (re-pattern patternString) line) (swap! data conj line))))
@data))
(defn myCalculation [file ]
(let [data1 (grabDataFromFile file "pattern1")
data2 (grabDataFromFile file "pattern2")
data3 (grabDataFromFile file "pattern3")]
;calculations or processes of data1, data2, data3....))
我的问题是,在这个 myCalculation 函数中,底层代码是否足够聪明,可以用 clojure reader 只打开一次文件,并一次性获取所需的所有数据?还是它打开和关闭文件的次数与函数 grabDataFromFile 的调用次数一样多?(在这个例子中,3)
一个后续问题是,如果读者不够聪明,并且我必须故意将“解析器”代码与“处理”代码分开,我该怎么做才能加快速度?