On Thu, Jun 11, 2009 at 3:03 PM, Adrian
Cuthbertson<[email protected]> wrote:
>
> Here's a fuller example of similar techniques extracted from a working
> program. It reads a file of lines and applies some transformations and
> accumulates a vector of records which it finally returns;
>
> (defn some-fn
> "Read a file and return a vector of its records."
> [fpath]
> (let
> [r (BufferedReader. (FileReader. (File. fpath)))]
> (try
> (let [line (.readLine r)] ; discard line 1
> (loop [line (.readLine r) recs []]
> (if-not line recs
> (let [rec (do-something-with line)
> newrecs (conj recs rec)]
> (recur (.readLine r) newrec)))))
> (finally
> (.close r)))))
To test this I'm using:
(import '(java.io File FileReader BufferedReader))
(defn do-something-with [line] (.toUpperCase line))
Note that (let [r ...] (try ... (finally (.close r)))) is
already packaged up in the with-open macro:
(defn some-fn
"Read a file and return a vector of its records."
[fpath]
(with-open [r (BufferedReader. (FileReader. (File. fpath)))]
(.readLine r) ; discard line 1
(loop [line (.readLine r) recs []]
(if-not line
recs
(let [rec (do-something-with line)
newrecs (conj recs rec)]
(recur (.readLine r) newrecs))))))
Also note that this is a great candidate for line-seq:
(defn some-fn
"Read a file and return a vector of its records."
[fpath]
(with-open [r (BufferedReader. (FileReader. (File. fpath)))]
(vec (map do-something-with
(next ; discard first line
(line-seq r))))))
--Chouser
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---