On Nov 30, 7:47 pm, Chouser <[EMAIL PROTECTED]> wrote:
> On Sun, Nov 30, 2008 at 5:52 PM, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
>
> > 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?
>
> Generally, collect the information you need from the catch clause and
> return it to a context where recur can be called if needed.
>
> (defn prompt-for-int [prompt junk-allowed default]
>   (let [input (prompt-read prompt)
>         num (try (Integer/valueOf input)
>               (catch Exception _ :fail))]
>     (if (= num :fail)
>       (if junk-allowed
>         default
>         (recur prompt junk-allowed default))
>       num)))
>
> Note that the above ugliness is caused at least in part by a mismatch
> between the Java API and Clojure idioms.  If 'Integer/valueOf' were a
> Clojure function, I would expect nil to signal an error and any
> Integer returned to be valid:
>
> (defn parse-int [string]
>   (try (Integer. string) (catch Exception _)))
>
> This would allow for a much cleaner definition of prompt-for-int:
>
> (defn prompt-for-int [prompt junk-allowed default]
>   (or (parse-int (prompt-read prompt))
>     (if junk-allowed
>       default
>       (prompt-for-int prompt junk-allowed default))))
>
> Or, since a default only makes sense if it might be returned:
>
> (defn prompt-for-int
>   ([prompt] (or (prompt-for-int prompt nil) (recur prompt)))
>   ([prompt default] (or (parse-int (prompt-read prompt)) default)))
>
> --Chouser


That all makes sense and your solutions are succinct.  I agree with
your observation that the ugliness comes from a Java/Clojure
mismatch.  I also need to re-wire my brain to think in a more
functional and LISPy style.

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