On Mon, Dec 14, 2009 at 8:48 AM, Chouser <chou...@gmail.com> wrote:
> 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?
>

Yes, and could someone please check the other functions that were
patched similarly?

Thanks,

Rich

-- 
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