I think the OP's issue was that he has a sequence of things to close, determined at runtime. with-open itself is no use there, because the things to close must be known at compile-time.
He is correct that finally and catch do not permit iteration. They do permit function calls, hence my workaround. -- Sent from my iPhone. On Sep 13, 2009, at 8:03 PM, Kevin Downey <redc...@gmail.com> wrote: > > user=> (macroexpand '(with-open [x A y Y] do stuff here)) > (let* [x A] (try (clojure.core/with-open [y Y] do stuff here) (finally > (. x clojure.core/close)))) > user=> > > with-open expands to a (try (finally (.close ...))) > > On Sun, Sep 13, 2009 at 7:38 PM, Richard Newman <holyg...@gmail.com> > wrote: >> >>> Clojure does not seem to support iteration inside catch or finally >>> forms. >> >> Apparently not directly. Splitting the iteration into a separate >> named >> function works, though: >> >> (defn print-seq [foo] >> (doseq [x foo] >> (println x))) >> >> (let [foo (atom [1 2 3])] >> (try >> (throw (new Exception "foo")) >> (catch Exception e >> (print-seq @foo)))) >> >> >> so you could try >> >> (defn close-all-files [files] >> (doseq [file files] >> (.close file))) >> >> (let [files (atom [])] >> (try >> (open-my-many-files files) >> ;; the files atom now refers to a vector of open file handles >> (do-dangerous-io @files) >> (finally >> (close-all-files @files)))) >> >> -R >> >>> >> > > > > -- > And what is good, Phaedrus, > And what is not good— > Need we ask anyone to tell us these things? > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---