On Thu, Jul 9, 2009 at 12:10, Mike<cki...@gmail.com> wrote:
>
> I wanted to grab bytes out of a stream, and didn't see an analogue to
> reader from duck-streams, so I made my own:
>
> (defn byte-seq
>  "Returns the bytes from stream as a lazy sequence of ints.
>  stream must implement java.io.InputStream."
>  [#^java.io.InputStream stream]
>  (lazy-seq
>   (let [b  (. stream (read))]
>     (if (>= b 0)
>       (cons b (byte-seq stream))))))
>
> Then I did a simple lazy operation on a stream of bytes, say, to drop
> the first 5:
>
> (with-open [st (FileInputStream. "mike.clj")] (drop 5 (byte-seq st)))
>
> I was a little surprised at first getting java.io.IOException: Bad
> file descriptor, but of course it hit me:  the laziness persists well
> beyond the .close() in the with-open.
>
> I modified my byte-seq to close the stream when EOF is reached, but
> this is an awful ugly solution having the inner thing know when to
> close the outer concern's thing.  (What if the outer thing wants to
> rewind?  etc.)
>
> Is there a pattern out there in Clojure for handling laziness at the
> same time as handling resource lifecycle (with-open, etc.)?
>

I'd just like to pile-on to say that I ran into the same question last
night in a slightly different form.

I have a file containing a sequence of clojure forms, which I want to
read in sequentially. I don't have to have them all in memory at the
same time for my task. A lazy sequence which yielded parsed forms
while consuming bytes from the underlying file would be a perfect
solution, but I ran into the same issue.

I close the file when EOF is reached. I can (but don't yet, because it
was a quick hack late at night) catch IOExceptions and close the
underlying file under those circumstances, but this is ugly.

What happens if the caller grabs such a lazy sequence and then just
drops it on the floor? Does the file ever get closed before the VM
exits? Do InputStreams register a finalizer?

Needed: a pattern for handing a lazy sequence backed by a closeable resource.

// ben

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to