Hi Dave,
Am 07.11.2012 um 20:09 schrieb Dave Ray:
> There aren't any problems with with-open/doseq/line-seq. The issue is
> with with-open/line-seq. For example, it's instinctive (at least for
> me anyway) to want to write a function like this:
>
> (defn get-records [file-name]
> (with-open [r (reader file-name)]
> (line-seq r)))
>
> Of course, the problem here is that the lazy sequence "escapes" the
> with-open scope and you get an exception when you start consuming it.
> And given a sequence there's no mechanism to say "I'm done with you,
> clean up any resources you may be using".
>
> That's the crux of it for me anyway. It seems like the simplest
> approach is to just adjust my instincts and always make sure the
> sequence is fully consumed within the with-open.
You should probably adjust your instincts to the following API pattern:
(defn get-record-stream
[stream]
(line-seq stream))
(defn get-records
[filename]
(with-open [s (io/input-stream filename)]
(doall (get-record-stream s))))
So you are free to choose what to do. Slurping the whole file, or handling the
resource higher up the stack. Additionally you get non-file sources. Even if
you normally don't need it, it comes in handy when testing.
My 0.02€.
Meikel
--
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