On Sun, Dec 13, 2009 at 7:07 PM, Mark Triggs <mark.h.tri...@gmail.com> wrote: > Hi all, > > I recently pulled down the latest Clojure master branch and have noticed > a small change in line-seq's behaviour which breaks some of my code. > The code in question uses line-seq like this: > > (use 'clojure.contrib.duck-streams) > (with-open [ss (java.net.ServerSocket. 4141)] > (println (first (line-seq (reader (.accept ss)))))) > > If I run this then telnet to the listen port and send a single line: > > Trying 127.0.0.1... > Connected to localhost. > Escape character is '^]'. > hi > > The above code prints nothing until the *second* line arrives from the > socket, even though that line isn't required to fulfil my (first ...) > request. It appears this behaviour changed in patch 284ee8aa in an > effort to make line-seq return nil (instead of ()) for an empty lazy > seq. The line-seq definition currently reads: > > (defn line-seq > "Returns the lines of text from rdr as a lazy sequence of strings. > rdr must implement java.io.BufferedReader." > [#^java.io.BufferedReader rdr] > (let [line (. rdr (readLine))] > (when line > (lazy-seq (cons line (line-seq rdr)))))) > > and when my code above is blocked, it's because my call to 'first' has > caused the first recursive call to be made, which immediately blocks on > the now-eagerly-performed readLine for the second line of input. Taking > the line to be returned out of the lazy-seq seems to fix things for me: > > (defn line-seq > "Returns the lines of text from rdr as a lazy sequence of strings. > rdr must implement java.io.BufferedReader." > [#^java.io.BufferedReader rdr] > (let [line (. rdr (readLine))] > (when line > (cons line (lazy-seq (line-seq-new rdr)))))) > > and, I think, still preserves the intention of the original change. > Does that seem reasonable?
Your analysis and solution seem right to me. Rich, would you accept a ticket for this? --Chouser -- 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