Wow. Ok, yeah, I'm glad he didn't put that version in the article :) On Tue, May 12, 2009 at 1:17 PM, Stephen C. Gilardi <squee...@mac.com>wrote:
> > On May 12, 2009, at 12:30 PM, Andrew Wagner wrote: > >> It seems like this idiom would be easy to implement in this macro. Or am I >> missing something? >> > > The current implementation of clojure.core/with-open works with multiple > bindings the way you're advocating. The one in the article makes for an > easier to understand example. As I recall, it's an older version before > Clojure changed to use vectors for binding forms pervasively. > > --Steve > > Clojure 1.1.0-alpha-SNAPSHOT > user=> (doc with-open) > ------------------------- > clojure.core/with-open > ([bindings & body]) > Macro > bindings => [name init ...] > > Evaluates body in a try expression with names bound to the values > of the inits, and a finally clause that calls (.close name) on each > name in reverse order. > nil > user=> (source with-open) > (defmacro with-open > "bindings => [name init ...] > > Evaluates body in a try expression with names bound to the values > of the inits, and a finally clause that calls (.close name) on each > name in reverse order." > [bindings & body] > (assert-args with-open > (vector? bindings) "a vector for its binding" > (even? (count bindings)) "an even number of forms in binding vector") > (cond > (= (count bindings) 0) `(do ~...@body) > (symbol? (bindings 0)) `(let ~(subvec bindings 0 2) > (try > (with-open ~(subvec bindings 2) ~...@body) > (finally > (. ~(bindings 0) close)))) > :else (throw (IllegalArgumentException. > "with-open only allows Symbols in bindings")))) > nil > user=> > > --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---