Your first implementation probably failed because map is lazy, so none of 
the '.write' calls happened during the with-open block. Try doseq.



On Friday, October 31, 2014 1:08:01 PM UTC-7, Sam Raker wrote:
>
> I'm writing some stuff to interact with the Twitter API. I want to be able 
> to write tweets (as JSON) to a file, so I can, e.g., test things without 
> connecting to the API. I've proxied the LinkedBlockingQueue that Twitter's 
> HBC library uses to use an agent, so ideally I want to be able to write the 
> contents of the agent AND the LBQ. Here's what I have right now:
>
> (defmulti write-tweets (fn [q f] (class q)))
> (defmethod write-tweets clojure.lang.Agent [a f]
>   (with-open [w (clojure.java.io/writer f :append true)]
>     (.write w (apply str (interpose "\n" @a)))))
> (defmethod write-tweets java.util.concurrent.LinkedBlockingQueue [lbq f]
>     (loop [res (.take lbq)]
>       (if res
>         (recur 
>           (with-open [w (clojure.java.io/writer f :append true)]
>             (.write w (str (generate-string res) "\n")))))))
>
> My first implementation of this used `(map #(.write w %) @a)` and had the 
> `recur` within the `with-open` block. Unfortunately, at least with the 
> agent part, I ran into an error about the file being closed when I tried to 
> write to it. I assumed `with-open` kept the file open within the block, but 
> maybe I'm missing something? I'm worried about the performance of either 
> creating a potentially super-huge string in memory for the agent method 
> (twitter returns pretty sizable JSON blobs) or repeatedly opening/closing a 
> file for the LBQ method (I realize I could collapse this into one problem 
> by taking everything out of the LBQ and putting it into an agent, but 
> that's not really a solution...)
>
> Does `writer` auto-close the file after it's done? Is there some better 
> way of handling this kind of situation? 
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to