On Nov 30, 3:51 pm, "Michael Wood" <[EMAIL PROTECTED]> wrote:
> On Sun, Nov 30, 2008 at 9:29 PM, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
>
> > On Nov 29, 7:52 am, Rich Hickey <[EMAIL PROTECTED]> wrote:
> >> On Nov 29, 2008, at 6:49 AM, Daniel Renfer wrote:
>
> >> > Even if you don't think you'll run into the possibility of blowing
> >> > your stack, it's still a good idea to use recur when doing tail call
> >> > recursion. The compiler will help you out by making sure it really is
> >> > a tail call.
>
> >> > Remember, recur isn't just for loop. It works with functions too.
>
> >> In case that isn't clear, it means that anywhere you would do a self
> >> call in a tail position you can replace it with recur to ensure no
> >> stack growth, e.g. the first example could have been written:
>
> >> (defn construct-atom
> >>   "translates a number n into an set of letters of size n"
> >>   [construct length]
> >>   (if (< (count construct) length)
> >>     (recur (conj construct (char (+ (rand-int amino_acids) 65))) length)
> >>     construct))
>
> >> recur will goto the nearest enclosing loop or fn.
>
> >> Rich
>
> > What about the case where recursing from a catch clause?
>
> > e.g.
>
> > (defn prompt-for-int [prompt junk-allowed default]
> >  (let [input (prompt-read prompt)]
> >    (try (Integer/valueOf input)
> >      (catch NumberFormatException _
> >        (if junk-allowed
> >            default
> >            (prompt-for-int prompt junk-allowed default))))))
>
> > If I use recur I get the following exception:
>
> > java.lang.UnsupportedOperationException: Cannot recur from catch/
> > finally
>
> > I'm sure there is a more idiomatic way to write this.  Maybe that's
> > the question I really need to ask?  How can I rewrite the above?
>
> I don't know the technical reason for disallowing recur from within a
> catch/finally.  A more restricted case came up recently in this
> thread:
>
> http://groups.google.com/group/clojure/browse_thread/thread/2c9f01888...
>
> But that won't help with your case.
>
> I suppose you could use a helper function that returns nil if there
> was junk and then recur if you get nil back from the helper?
>
> --
> Michael Wood <[EMAIL PROTECTED]>

I've read that thread.  Rich ends it by stating "it's an arbitrary
restriction because of complexity."

The helper function would work just fine, and if this was code for
some important project then I probably would go that route.  I guess I
still feel my initial solution should be appropriate, but I would like
to be able to do it with recur as to avoid overflow.  Any other
solutions that would avoid a helper function?  Not just for my
particular case, but anytime that one is calling recur from a catch
clause?
--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to