Hi Greg, here's a sample but realistic pattern of the sort of thing
you're doing;
(import '(java.io BufferedReader FileReader File IOException)
'(bqutils BQUtil))
(defn samp-loop
"Read a csv file containing user records."
[#^String fpath]
(with-open [r (BufferedReader. (FileReader. (File. fpath)))]
(let [; read line 1 for field names
line (.readLine r)
flds (seq (BQUtil/parseCsv line))
nflds (count flds)]
(try
(loop [line (.readLine r) i 0 ]
(when line
(let [ri (seq (BQUtil/parseCsv line))
_ (when (not (= (count ri) nflds))
(throw (IOException. (str "Bad line:"i))))
[uid lname inits] ri]
(println :lname lname :inits inits :uid uid)
(if (= "" uid)
(println "Breaking at line:" i)
(recur (.readLine r) (inc i) )))))
(catch Exception x (prn (.toString x)))
(finally (println "Done:" flds))))))
A few notes;
- BQUtil is home-grown java fn for parsing csv to ArrayLists.
Note the wrapping in seq and then destructuring to get the
field values for each line.
- The outer let (flds) is in scope in the (finally
- The (with-open has its own (finally
- You can throw within the loop - note the throw within
the let using a dummy _ placeholder
- Note the line counter
- Note the technique to "break" when uid = ""
(assuming that's what you wanted to do)
Hth, Adrian.
On Tue, Dec 15, 2009 at 4:07 AM, Greg Harman <[email protected]> wrote:
> I have a function foo which uses tail recursion:
>
> (defn foo [] .... (recur))
>
> I need to do some clean-up work after foo (there is an external
> binding that requires some post-foo processing), and this needs to
> happen even if foo fails. The naive approach was:
>
> (try (foo)
> (finally (clean-up))
>
> However, foo recurs and you can't recur in a try/catch/finally.
> (java.lang.UnsupportedOperationException: Cannot recur from catch/
> finally)
>
> So, my question is: does anyone have a pattern for exception checking
> (this same issue would work if I just wanted to catch an exception in
> foo) when the contents of the try block recur?
>
> I could just remove the tail recursion and go for straight recursion
> in foo, but there's got to be a better way...
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to [email protected]
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> [email protected]
> 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 post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en