On Tue, Dec 15, 2009 at 1:08 AM, Greg Harman <ghar...@gmail.com> wrote:
> Actually, the for didn't work for me either but I believe that was a
> lazy evaluation issue. The doseq seems to use internal recursion,
> which breaks the try/finally. My final solution was to build up doseq
> functionality with reduce. See below:
>
> (defn foo1 []
>  (try
>   (println "body")
>   (finally
>    (doseq [x (range 3)] (println x)))))
>
> (defn foo2 []
>  (try
>   (println "body")
>   (finally
>    (for [x (range 3)] (println x)))))
>
> (defn foo3 []
>  (try
>   (println "body")
>   (finally
>    (reduce (fn [y x] (println x)) () (range 3)))))
>
> - The foo1 definition can't be evaluated b/c of
> java.lang.UnsupportedOperationException: Cannot recur from catch/
> finally

Simply moving the body of the 'finally' to a fn syntactically
outside the 'finally' clause itself should always work without
having to reimplement the body itself:

(defn foo-fn []
  (let [f #(doseq [x (range 3)]
             (println x))]
     (try (println "body")
       (finally (f)))))

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

Reply via email to